与%c和%s相关的行为的scanf异常

安库的建议

我需要使用scanf一个字符和一个字符串来存储用户的答案。(是/否)
下面的代码跳过scanf("%c", &elem)

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);
}
./out
enter the elements
a
you have entered a
enqueue elem= a
please enter yes or no yes
enter the elements

you have entered

enqueue elem=
母亲

您的代码中没有任何scanf(“%c”,&elem)...顺便说一句,问题出在scanf的输入上。当您通过scanf获得输入时,输入字符将保留在输入缓冲区中,第二轮您的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();
}

您可以在此处找到有关如何清除输入缓冲区的更多信息:如何在C语言中清除输入缓冲区?

我可以建议您考虑两件事:

  1. 对于仅获取一个字符,我个人发现它在Windows中使用getchgetche运行起来要容易得多,并且在GCC兼容环境中等效。您可以在线或在此行中找到它的示例[在Linux中,什么等效于getch()和getche()?
  2. 读取输入后,请务必刷新输入缓冲区,以防止发生任何类似的问题。

输入函数检查输入缓冲区(可以在0xb8000000找到),并检查那里的第一个输入。如果缓冲区为空,则他们等待用户输入输入,否则,他们检查缓冲区中的第一个元素,然后检查其是否达到期望读取的值。如果成功,则将其读取并从缓冲区中将其删除。否则,它们将无法为您提供输入,并且根据功能,结果会有所不同。

例如,考虑以下行:

scanf("%d %d %f", &a, &b &c);

并输入为:a 2 4scanf将返回0,这意味着它将读取零个输入,因此'a',2和4仍保留在缓冲区中。因此您的缓冲区看起来像:[a,2,4]。结果,如果您添加以下行:scanf(“%c”,&ch); scanf将尝试从缓冲区中获取字符,然后读取字符“ a”并将其放入变量ch中。因此它不会从用户那里得到任何输入。最后,您的缓冲区又有了2和4。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C scanf 奇怪的行为

来自分类Dev

奇怪的printf和scanf行为

来自分类Dev

scanf(“%s”,name)之间的区别;和scanf(“%[^ \ n]%* c”,名称);

来自分类Dev

C ++异常,未定义行为和noexcept

来自分类Dev

C ++布尔函数的异常行为和不可能的返回

来自分类Dev

C ++异常,未定义行为和noexcept

来自分类Dev

对齐和SSE异常行为

来自分类Dev

翻译行为和相关模型翻译

来自分类Dev

mysqldump行为和相关的InnoDB性能

来自分类Dev

scanf和scanf_s之间的区别

来自分类Dev

scanf(“%[^ \ n]”)和scanf(“%s”)之间的区别?

来自分类Dev

scanf和scanf_s之间的区别

来自分类Dev

scanf()的行为

来自分类Dev

C for循环行为异常

来自分类Dev

getline(cin)行为异常(C ++)

来自分类Dev

C的文件IO的行为异常

来自分类Dev

C中的指针,异常行为

来自分类Dev

构造函数<X,Y>(C <Y>)和接口C <Y>的Java泛型异常行为

来自分类Dev

组织捕获和时钟行为异常

来自分类Dev

访问冲突和Visual Studio的异常行为

来自分类Dev

jQuery html()和append()的异常行为

来自分类Dev

异常行为:typedef和同名对象

来自分类Dev

使用ssh查找,printf和异常行为

来自分类Dev

开关和外壳掉线,异常行为

来自分类Dev

熊猫Timedelta属性(_m,_s):异常行为

来自分类Dev

strncpy_s函数的异常行为

来自分类Dev

调用构造函数时异常的C ++行为

来自分类Dev

C ++程序的异常/错误行为

来自分类Dev

C ++条件变量wait_for行为异常