2013-03-18 108 views
26

我在C中編寫了一個非常小的程序,需要檢查某個字符串是否爲空。對於這個問題的緣故,我已經簡化我的代碼:如何檢查C字符串是否爲空

#include <stdio.h> 
#include <string> 

int main() { 
char url[63] = {'\0'}; 
do { 


    printf("Enter a URL: "); 
    scanf("%s", url); 
    printf("%s", url); 

} while (/*what should I put in here?*/); 

return(0); 
} 

我想程序停止,如果用戶只是按下不輸入任何進入循環。

謝謝。

編輯:

我在這裏有一個小問題。當我在沒有輸入任何內容的情況下點擊進入終端時,光標就跳到下一行。是否有任何東西只是讓它不提交而不是移到下一行?

編輯:

我發現,添加在scanf [^ \ n]的讓我輸入任何內容,仍然有它提交。但是,當我輸入內容時,它會再運行一次,然後自行退出循環。下面是更新後的代碼:

int main() { 
char url[63] = {'\0'}; 
do { 
    printf("Enter a URL: "); 
    scanf("%[^\n]s", url); 
} while (url[0] != '\0'); 

return(0); 
} 
+0

在將問題發佈到SO之前,請閱讀文檔(在本例中爲'scanf')*。 – 2013-03-26 04:23:37

回答

34

由於C風格的字符串總是以空字符(\0)終止,您可以通過編寫

do { 
    ... 
} while (url[0] != '\0'); 
檢查字符串是否爲空

或者,您可以使用strcmp函數,這是過度殺傷但可能更易於閱讀:

do { 
    ... 
} while (strcmp(url, "")); 

請注意,strcmp如果字符串不同則返回非零值,如果它們相同則返回0,因此此循環將繼續循環,直到字符串非空。

希望這會有所幫助!

+1

while(url [0]!='\ 0');只要字符串不爲空,它將繼續循環。你想:while(url [0] ==''0'); – andrewhl 2014-01-21 17:40:27

+1

或'!* url'真棒。 – bambams 2014-09-17 19:03:55

2

你可以嘗試這樣的: -

if (string[0] == '\0') { 
} 

在你的情況下,它可以像: -

do { 
    ... 
} while (url[0] != '\0') 

;

+0

如果用戶什麼都不輸入,這仍然不起作用。光標只是跳到下一行而不是不提交任何內容。 – codedude 2013-03-18 22:00:05

8

如果你想檢查一個字符串是空的:

if (str[0] == '\0') 
{ 
    // your code here 
} 
1

strlen(url)

返回字符串的長度。它計數所有字符,直到找到空字節。根據你的情況,檢查它反對0

,或只與手動檢查:

*url == '\0' 
+0

如果用戶什麼都不輸入,這仍然不起作用。光標只是跳到下一行而不是不提交任何內容。 – codedude 2013-03-18 22:01:30

6

如果第一個字符恰好是'\0',那麼你有一個空字符串。

這是你應該做的:

do { 
    /* 
    * Resetting first character before getting input. 
    */ 
    url[0] = '\0'; 

    // code 
} while (url[0] != '\0'); 
+0

如果用戶什麼都不輸入,這仍然不起作用。光標只是跳到下一行而不是不提交任何內容。 – codedude 2013-03-18 22:01:58

+0

這個怎麼樣? (更新) – 2013-03-18 22:06:09

+0

不是。當用戶點擊輸入而不是輸入數據時,循環應停止運行。現在,它只是跳到下一行。 – codedude 2013-03-18 22:12:58

1

您可以從scanf查看返回值。這段代碼只會坐在那裏,直到收到一個字符串。

int a; 

do { 
    // other code 
    a = scanf("%s", url); 

} while (a <= 0); 
3

通常來講,你將有一個很難及彼一個空字符串,考慮%s忽略空白(空格,製表符,換行符)......但無論如何,scanf()實際返回的成功次數匹配...

從手冊頁:

成功匹配和分配的輸入項,它可以少於規定,甚至是零在早期匹配失敗的情況下的數量。

因此,如果他們設法使用空字符串(例如ctrl+z),您可以檢查返回結果。

int count = 0; 
do { 
    ... 
    count = scanf("%62s", url); // You should check return values and limit the 
           // input length 
    ... 
} while (count <= 0) 

注意你必須檢查不是因爲在我給的例子少,那你將獲得-1,在手冊頁再次詳細:

值EOF是,如果結束返回在第一次成功轉換或發生匹配失敗之前達到輸入。如果發生讀取錯誤,EOF也會返回,在這種情況下,流的錯誤指示符(請參閱ferror(3))已設置,並且設置errno表示錯誤。

2

首先更換scanf()fgets() ...

do { 
    if (!fgets(url, sizeof url, stdin)) /* error */; 
    /* ... */ 
} while (*url != '\n'); 
0

用的strtok(),它可以在短短的一個行來完成: 「如果(strtok的(S,」 \ t「的)==空值)」。 例如:

#include <stdio.h> 
#include <string.h> 

int is_whitespace(char *s) { 
    if (strtok(s," \t")==NULL) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 

void demo(void) { 
    char s1[128]; 
    char s2[128]; 
    strcpy(s1," abc \t "); 
    strcpy(s2," \t "); 
    printf("s1 = \"%s\"\n", s1); 
    printf("s2 = \"%s\"\n", s2); 
    printf("is_whitespace(s1)=%d\n",is_whitespace(s1)); 
    printf("is_whitespace(s2)=%d\n",is_whitespace(s2)); 
} 

int main() { 
    char url[63] = {'\0'}; 
    do { 
     printf("Enter a URL: "); 
     scanf("%s", url); 
     printf("url='%s'\n", url); 
    } while (is_whitespace(url)); 
    return 0; 
} 
+0

如果我理解這個權利,這將檢查空白而不是空字符串。 – Jonathan 2014-11-05 12:24:54

相關問題