[英]Easy C - Ignoring scanf()
我正在嘗試學習C,但是在讓我的程序識別scanf()
函數時遇到了困難。 我已經在下面包含了我的代碼,並且我確定這是一個愚蠢的錯誤-任何指導都非常感激:)
int i = 0;
int boolean = 1;
while (boolean) {
printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
scanf("%d", &i);
if (i==4) {
boolean--;
break;
}
else if(i <= 3 && i >=1) {
/*will edit later - irrelevant*/
}
else {
printf("Please enter a valid number");
}
}
當我運行程序時,甚至沒有提示用戶輸入數字-而是因為布爾值永遠不會為假,所以我陷入了無限循環。 為什么程序不停止並接受用戶輸入?
編輯
我現在看到,與該代碼的不同之處在於,更重要的是,我之前是從文本文件重定向STDIN(我剛剛將其命名為filename,因此在運行程序時從命令行輸入“ ll類型:./myProgram <文件名)這是我的程序不要求用戶輸入更多內容的原因,因為它轉而使用文件名嗎? 我認為它只是從文件名讀取,然后允許我切換回要求用戶輸入數字。
它可以在我的XCode 5,Mac OSX Mavericks機器上運行。 如果這是在主函數上,請確保返回0;否則,請返回0。 函數末尾的行。
如果您忽略scanf()
的返回狀態,則您的代碼似乎將忽略scanf()
。
如注釋中廣泛指出的那樣,您的代碼應更像:
int i = 0;
int boolean = 1;
while (boolean) {
int rc;
printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
if ((rc = scanf("%d", &i)) != 1)
{
int c;
printf("DEBUG: scanf failed: rc = %d\n", rc);
while ((c = getchar()) != EOF && c != '\n')
printf("DEBUG: next character: %d (%c)\n", c, c);
break;
}
if (i==4) {
boolean--;
break;
}
else if (i <= 3 && i >=1) {
printf("DEBUG: i = %d\n", i);
/*will edit later - irrelevant*/
}
else {
printf("Please enter a valid number!\n");
}
}
注意否則執行該部分中的調試打印。
我還添加了調試打印功能,以在scanf()
失敗后報告輸入行上剩余的字符。 請注意,針對此類問題的首選解決方案是使用fgets()
或getline()
讀取行並使用sscanf()
解析行,這使得錯誤報告變得更加簡單; 您需要報告整行,而不是在scanf()
完之后剩下的內容。
可以簡化此過程以避免使用名為boolean
的變量:
int i = 0;
while (i != 4) {
int rc;
printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
if ((rc = scanf("%d", &i)) != 1)
{
printf("scanf failed: rc = %d\n", rc);
break;
}
if (i==4) {
printf("read %d - quit\n", i);
break;
}
else if (i <= 3 && i >=1) {
printf("DEBUG: i = %d\n", i);
/*will edit later - irrelevant*/
}
else {
printf("Please enter a valid number!\n");
}
}
關鍵是測試scanf()
的返回值。
#include <stdio.h>
int main(void)
{
int i = 0;
while (i != 4)
{
int rc;
printf("Options\n1.Save\n2.Load\n3.Edit\n4.Quit\n");
if ((rc = scanf("%d", &i)) != 1)
{
int c;
printf("DEBUG: scanf failed: rc = %d\n", rc);
while ((c = getchar()) != EOF && c != '\n')
printf("DEBUG: next character: %d (%c)\n", c, c);
break;
}
else if (i == 4)
{
printf("Got %d - quitting\n", i);
break;
}
else if (i <= 3 && i >= 1)
printf("DEBUG: i = %d\n", i);
else
printf("Please enter a valid number! (got %d)\n", i);
}
printf("After loop\n");
return 0;
}
gcc -O3 -g -std=c11 -Wall -Wextra -Werror xscan.c -o xscan
$ xscan < xdata.1
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: i = 1
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: i = 2
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: i = 3
Options
1.Save
2.Load
3.Edit
4.Quit
DEBUG: scanf failed: rc = 0
DEBUG: next character: 120 (x)
After loop
$
$ xscan < xdata.2
Options
1.Save
2.Load
3.Edit
4.Quit
Please enter a valid number! (got 0)
Options
1.Save
2.Load
3.Edit
4.Quit
Please enter a valid number! (got 5)
Options
1.Save
2.Load
3.Edit
4.Quit
Got 4 - quitting
After loop
$
1
2
3
x
0
5
4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.