具有%c和%s相关行为的扫描异常
我需要使用具有%c和%s相关行为的扫描异常,c,scanf,C,Scanf,我需要使用scanf获取一个字符和一个字符串,用于存储用户的答案。(是/否) 下面的代码跳过scanf(“%c”和&elem) while(!strcmp(“是”,选项)) { printf(“输入元素\n\n”); elem=getchar(); printf(“您已输入%c\n”,elem); 排队(st,elem); printf(“请输入是或否”); scanf(“%s[^\n]”,选项); } 按Enter/Return键输入元素时,一个\n字符也会随元素一起传递到缓冲区。此\n在下
scanf
获取一个字符和一个字符串,用于存储用户的答案。(是/否)下面的代码跳过scanf(“%c”和&elem)
while(!strcmp(“是”,选项))
{
printf(“输入元素\n\n”);
elem=getchar();
printf(“您已输入%c\n”,elem);
排队(st,elem);
printf(“请输入是或否”);
scanf(“%s[^\n]”,选项);
}
按Enter/Return键输入元素时,一个\n
字符也会随元素一起传递到缓冲区。此\n
在下次调用时由您的getchar
读取
要使用此\n
请将此行放在getchar()之后代码>
int ch;
while((ch = getchar()) != EOF && ch != '\n');
您的代码中没有任何scanf(“%c”、&elem)。。。顺便说一句,问题在于输入scanf。当您通过scanf获得输入时,输入缓冲区中会保留一个enter字符,该字符将在第二轮中由getchar()函数读取。解决此问题的一个简单方法是在scanf行之后添加一个伪getchar:
while ( !strcmp ("yes",option))
{
printf("enter the elements \n\n");
elem=getchar();
printf("you have entered %c\n",elem);
enqueue(st,elem);
printf("please enter yes or no ");
scanf("%s[^\n]",option);
getchar();
}
您可以在此处找到有关如何清除输入缓冲区的更多信息:
我可以建议你考虑两件事:
为了只获取一个字符,我个人发现在Windows中使用getch
和getche
函数要容易得多,在与GCC兼容的环境中也可以使用它们。你可以在网上或这条线上找到它的样品[
读取输入后,请始终刷新输入缓冲区,以防止发生任何类似问题
输入函数检查输入缓冲区(您可以在0xb8000000处找到),并检查那里的第一个输入。如果缓冲区为空,则等待用户输入,否则,将检查缓冲区中的第一个元素,然后检查其预期读取的内容。如果成功,则读取该元素并将其从缓冲区中删除。其他在ise中,它们无法提供您的输入,并且根据功能的不同,结果会有所不同
例如,考虑下面的行:
scanf("%d %d %f", &a, &b &c);
并将输入作为:
a24
scanf将返回0,这意味着它读取零输入,因此“a”、2和4保留在缓冲区中。因此,缓冲区看起来像:[a、2、4]。因此,如果添加以下行:
scanf(“%c”和“ch”);
scanf将尝试从缓冲区中获取一个字符,它读取字符“a”并将其放入变量ch中。因此,它不会从用户处获取任何输入。最终,缓冲区中会再次出现2和4。小心混合scanf()
格式说明符“%c”
,“%s”
和“%[]”
正确使用“%[^\n]”
:没有s
。如果不希望保存中的前导空格,请包括一个前导空格,如“%[^\n]”
正确使用“%c”
。如果不希望保存中的前导空格,请在“%c”
中包含前导空格。OP的代码中可能会出现这种情况,因此前面的输入会被输入或使用“\n”
char elem;
scanf(" %c", &elem);
正确使用“%s”
。前导空格不带或不带前导空格
char option[100];
scanf("%99s", option);
// Following works the same.
scanf(" %99s", option);
没有scanf(%c……我的假设是您输入了a。getchar读取“a”,然后scanf读取。如果您注意到其输出中的以下行,则第二个“是”是他的输入。请输入是或否是。我在发布答案之前测试了应用程序,只是为了确定。如果用户输入元素为abcd
getch,这将不起作用ar
不是一个只获取整数的好函数。对于windows用户更好的解决方案是getche
,对于unix/linux,我根据@haccks编写了自己的getch
和getche
方法,试图根据我所做的给出更完整的答案和可能的解决方案。请随时将答案更新为w把你的建议和想法写下来。你解释得很好:)。+1
char elem;
scanf(" %c", &elem);
char option[100];
scanf("%99s", option);
// Following works the same.
scanf(" %99s", option);