Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有%c和%s相关行为的扫描异常_C_Scanf - Fatal编程技术网

具有%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);