我有一个项目必须只在C中生成(我不允许使用C ++)。 现在我正在使用UI(在控制台中显示一个小菜单,每个选项都有一个从0到6的数字,用户输入数字,点击输入等等。)
我的阅读选项功能有问题。
起初我试过
int option;
scanf("%d", &option);
但是当我输入字符时,这会导致问题。
我试过读一个字符:
char option;
scanf("%s", &option);
option -= '0';
这让我可以像对待一个号码一样对待它并且对第一次测试很有帮助,让我验证选项是否有效(它不是一个字母,它是一个0到6之间的数字)
问题是我可以输入多个字符,所有字符都会存储在内存中。这显然很糟糕。
我尝试使用"%c"
进行阅读,但这会显示我输入的字符串中每个字符的错误消息。
为了使它更清楚,这是函数
int readOption(int maxOp)
{
char option = -1;
while(option < 0 || option > maxOp)
{
scanf("%c", &option);
option -= '0';
if(option < 0 || option > maxOp)
printf("Invalid option!\nTry again: \n");
}
return option;
}
如果我输入&#34; abc
&#34;,错误信息将被打印3次。
那么如何确保输入的任何额外字符都被忽略?
答案 0 :(得分:2)
试试这个
int ch;
scanf(" %c", &option);
while((ch = getchar()) != '\n');
答案 1 :(得分:0)
未经测试,买你可以尝试这样的事情:
scanf(" %[0-6]1d*[^\n]", &option);
对scanf
的调用仅在输入为0到6之间的单个数字时有效,忽略前导空格。 *
禁止任何字符不在此范围内且不是换行符。
答案 2 :(得分:0)
您可以使用getc()
来完成以下工作:
int main(){
char choice = getc(stdin);
fflush(stdin);
}
现在choice
是第一个输入的字符,删除第一个字符后输入的所有内容,因此不会打扰其他任何用户输入。
通常,当用户输入输入内容时,它会存储在名为stdin
的特殊缓冲区中,如果您在使用fflush(stdin)
读取了第一个字符后没有删除该缓冲区,则会中断以后的任何用户输入