2011-11-01 55 views

Trả lời

65

Kiểm tra xem ký tự đầu tiên có '\ 0' hay không. Bạn cũng nên kiểm tra nếu con trỏ của bạn là NULL.

char *c = ""; 
if ((c != NULL) && (c[0] == '\0')) { 
    printf("c is empty\n"); 
} 

Bạn có thể đặt cả hai kiểm tra này vào một chức năng để thuận tiện và dễ sử dụng lại.

Chỉnh sửa: Trong câu lệnh if có thể được đọc như sau: "Nếu c không bằng 0 và ký tự đầu tiên của mảng ký tự 'c' không phải là '\ 0' hoặc 0 thì ...".

&& chỉ cần kết hợp hai điều kiện. Về cơ bản giống như nói điều này:

if (c != NULL) { /* AND (or &&) */ 
    if (c[0] == '\0') { 
     printf("c is empty\n"); 
    } 
} 

Bạn có thể muốn có một cuốn sách lập trình C tốt nếu không rõ ràng với bạn. Tôi có thể giới thiệu một cuốn sách có tên là "Ngôn ngữ lập trình C".

Phiên bản ngắn nhất tương đương với trên sẽ là:

if (c && !c[0]) { 
    printf("c is empty\n"); 
} 
+0

@Zack: 'c && c [0]' nghĩa là gì? Bạn có thể giải thích nó không? – Aan

+0

Tôi sẽ chỉnh sửa câu trả lời. – codemaker

+0

Cá nhân tôi sẽ tách kiểm tra cho một con trỏ NULL từ kiểm tra cho một chuỗi rỗng; cả hai không thực sự liên quan. "di động nhiều hơn" có thể không thực sự là những gì bạn đang cố gắng nói, vì tất cả các mã bạn trình bày ở đây là hợp lệ C (và C++ là tốt). –

10

Kiểm tra con trỏ cho NULL và sau đó sử dụng strlen để xem nó có trả về 0 hay không.
NULL kiểm tra là quan trọng vì việc chuyển số NULL trỏ đến strlen gọi Hành vi không xác định.

+0

Cảm ơn rất nhiều Als – Aan

9

phương pháp ưa thích của tôi:

if (*ptr == 0) // empty string 

Có lẽ phổ biến hơn:

if (strlen(ptr) == 0) // empty string 
+4

Lưu ý rằng khả năng "phổ biến" thứ hai cũng chậm hơn không cần thiết. – jpalecek

+1

@jpalecek, sự chậm chạp thường không quan trọng và 'strlen' sẽ dễ hiểu hơn nếu bạn không quen với hình thức đầu tiên. –

+0

Cảm ơn Mark Ransom. – Aan

6

Chuỗi trống rỗng có một byte duy nhất. Vì vậy, kiểm tra if (s[0] == (char)0)

+2

Không cần cho phép '(char)'. – Jens

0
if (!*ptr) { /* empty string */} 

tương tự

if (*ptr) { /* not empty */ } 
+1

@igraczech, hmm, điều này sẽ hoạt động đối với trường hợp char * str = ""; if (! * str) {printf ("rỗng \ n"); }. tôi đã bỏ lỡ một số trường hợp tinh tế? – alvin

+0

Xin lỗi, bạn nói đúng - đó là sự giám sát con trỏ ngu ngốc của tôi. Tôi đã có trường hợp str đã trỏ đến một địa chỉ chứa '\ 0' chỉ. Vì vậy, con trỏ (* str) là không null trong đó giá trị (nội dung của địa chỉ được trỏ tới bởi str) là null. – igraczech

1

Tôi muốn sử dụng chức năng strlen như các chức năng thư viện được thực hiện một cách tốt nhất.

Vì vậy, tôi sẽ viết if (strlen (p) == 0) // rỗng chuỗi

+1

Ý tưởng tuyệt vời, cho phép lặp qua toàn bộ chuỗi (trong đó, cho tất cả các bạn biết, có thể có kích thước 2GB) chỉ để tìm hiểu xem nó có chứa ít nhất một ký tự không! –

+0

Tôi xin lỗi .. bạn đúng .. – bhuwansahni

+0

Tôi đã tìm thấy strlen gây ra một vụ tai nạn nếu char * là NULL ... – Todd

1

Cho nó một cơ hội:

Hãy thử lấy chuỗi thông qua chức năng được (string) sau đó kiểm tra điều kiện như thể (chuỗi [0] == '\ 0')

Các vấn đề liên quan