我有下面的代碼,如果提供的用戶輸入是空的,應該退出,即在詢問輸入時按[ENTER]。但是,如果按下[ENTER],它不會執行任何操作。c退出,如果字符串爲空
printf("Enter the website URL:\n");
scanf("%s", str);
if(strlen(str) == 0) {
printf("Empty URL");
exit(2);
}
我有下面的代碼,如果提供的用戶輸入是空的,應該退出,即在詢問輸入時按[ENTER]。但是,如果按下[ENTER],它不會執行任何操作。c退出,如果字符串爲空
printf("Enter the website URL:\n");
scanf("%s", str);
if(strlen(str) == 0) {
printf("Empty URL");
exit(2);
}
如果只是按下回車用戶,輸入仍將包含一個換行符('\n'
)。你的病情應該是
if (!strcmp(str, "\n"))
如果CTRL-d使用,或者如果輸入正在從一個文件重定向就會失敗。正確的解決方案是修剪輸入中的空白,然後檢查空字符串。 – meagar 2012-03-12 17:44:25
從某種意義上說,這是一個正確的答案,但它在C中初學者忽略了一個大問題:使用scanf而不是像fgets這樣的安全替換。如果您編輯包含關於scanf爲什麼不好的討論,我會贊成。 – 2012-03-12 17:45:41
你不應該檢查'\ n' - 換行嗎?輸入將表示爲一個新行字符'\ n'
%s
與scanf()
將放棄任何前導空格,其中它認爲您的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
不變。
我用一個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);
沒有嘗試使用調試器 – pm100 2012-03-12 17:43:36