2012-03-12 64 views
0

我有下面的代碼,如果提供的用戶輸入是空的,應該退出,即在詢問輸入時按[ENTER]。但是,如果按下[ENTER],它不會執行任何操作。c退出,如果字符串爲空

printf("Enter the website URL:\n"); 
scanf("%s", str); 
if(strlen(str) == 0) { 
    printf("Empty URL"); 
    exit(2); 
} 
+0

沒有嘗試使用調試器 – pm100 2012-03-12 17:43:36

回答

4

如果只是按下回車用戶,輸入仍將包含一個換行符('\n')。你的病情應該是

if (!strcmp(str, "\n")) 
+3

如果CTRL-d使用,或者如果輸入正在從一個文件重定向就會失敗。正確的解決方案是修剪輸入中的空白,然後檢查空字符串。 – meagar 2012-03-12 17:44:25

+0

從某種意義上說,這是一個正確的答案,但它在C中初學者忽略了一個大問題:使用scanf而不是像fgets這樣的安全替換。如果您編輯包含關於scanf爲什麼不好的討論,我會贊成。 – 2012-03-12 17:45:41

0

你不應該檢查'\ n' - 換行嗎?輸入將表示爲一個新行字符'\ n'

1

%sscanf()將放棄任何前導空格,其中它認爲您的Enter鍵。如果您希望能夠接受一個「空」的字符串,你需要接受另一種方式的輸入,可能使用fgets()

printf("Enter the website URL:\n"); 
fgets(str, SIZE_OF_STR, stdin); 
if(!strcmp(str,"\n")) { 
    printf("Empty URL"); 
    exit(2); 
} 

記住上面的代碼中並沒有考慮EOF,這將保持str不變。

2

我用一個isempty功能:

int isempty(const char *str) 
{ 
    for (; *str != '\0'; str++) 
    { 
     if (!isspace(*str)) 
     { 
      return 0; 
     } 
    } 

    return 1; 
} 

此外,我會建議使用fgets超過scanf,爲scanf是不安全的,並可能導致緩衝區溢出。

fgets(str, /* allocated size of str */, stdin);