2011-11-08 71 views
2

我試圖檢測從標準輸入的fgets輸入爲空(當我按下輸入而不輸入任何內容)。這裏是我的程序:如何檢測fgets的空字符串

int main() 
{ 
    char input[1000]; 
    printf("Enter :"); 
    fgets(input, 1000, stdin); 
    input[strlen(input) - 1] = '\0'; 

    if(input != '\0'){ 
     printf("hi"); 
    } 

    return 0; 

} 

我想做一些條件,使它不打印任何東西,但顯然這種方式是不正確的。我也試過NULL,這沒有奏效。

謝謝!

+0

@JamesMcNellis事實上,該行不會做任何事情,無論在哪裏'input'是從哪裏來的。 'strlen'函數只是搜索字符串中的第一個''\ 0',所以按照定義'input [strlen(input) - 1] =='\ 0''。它可能改變的唯一情況是引入一個段錯誤,如果'input'不是空終止的,並且在用完程序的地址空間之前不會發生任何''\ 0''。 –

回答

6

我覺得這是最可讀的(但不是高性能的):

if (strlen(input) != 0) { 
    printf("hi"); 
} 

但這裏教學的目的是你的風格,但後來修正:

if (input[0] != '\0') { 
    printf("hi"); 
} 

爲什麼input[0]?因爲input的行爲類似於指向數組第一個元素的指針,所以如果您將它比較,並且首先必須對其進行取消引用以使比較有用。

+0

+1,但'input'是一個數組,不是指向數組的指針。它在這種比較的背景下確實衰減爲指針,但重要的是要做出區分。 –

+0

@Carl Norum:Woops,我編輯了它。 – orlp

+0

是的,但你編輯爲相同(錯誤)的陳述。數組和指針並不是一回事,即使它們恰好在這個特定情況下可以互換使用。 –

2

最顯而易見的方法是這樣的:

if (input[0] != '\0') 
    printf("hi"); 

雖然使用strlen工作,這是潛在的相當浪費 - 它原來的O(1)操作爲O(N)。

2

當按下回車鍵時,fgets將返回'\ n';這使得總字符串「\ n \ 0」。你可以用這個值進行字符串比較,但更強大的解決方法是「去除」或「修剪」字符串以刪除所有前導和尾隨空白(在進行任何處理之前,您應該執行任何操作),然後檢查空字符串。

最簡單的修改是檢查是否(*input!='\n')。我應該注意到,這也需要你刪除空終止的代碼,這可以去掉這個換行符(據推測,這是設計)。

1

爲了安全起見,最好使用這樣的:

if(u_input[0] == '\n' && u_input[1] == '\0'){ 
    printf("hi"); 
}