Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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语言中用户字符扫描的基本原理_C - Fatal编程技术网

C语言中用户字符扫描的基本原理

C语言中用户字符扫描的基本原理,c,C,嗨,这个问题看起来可能有点愚蠢,但我在这里面临着一些严重的基本面不足,我无法理解。这是一个非常简单的扫描四个字符的代码,但它不能正常工作。这是一个更大的程序的摘录,但这就是我面临的问题。谁能指出是哪里出的错 #include<stdio.h> #include<stdlib.h> { char a, b, c, d; printf("Enter the value of a\n"); scanf("%c", &a); if(a =

嗨,这个问题看起来可能有点愚蠢,但我在这里面临着一些严重的基本面不足,我无法理解。这是一个非常简单的扫描四个字符的代码,但它不能正常工作。这是一个更大的程序的摘录,但这就是我面临的问题。谁能指出是哪里出的错

#include<stdio.h>
#include<stdlib.h>
{

    char a, b, c, d;
    printf("Enter the value of a\n");
    scanf("%c", &a);
    if(a == 'Y')
    {

        printf("Enter if this question is stupid or no Y/N\n");
        scanf("%c", &b);

    }
    else
    {

        printf("This is such a big waste of time");

    }

    printf("Enter the value of c\n");
    scanf("%c", &c);

    if(c == 'Y')
    {

        printf("Enter if I am stupid or no? Y/N\n");
        scanf("%c", &d);

    }
    else
    {

        printf("I will go mad soon\n");

    }

}
#包括
#包括
{
字符a、b、c、d;
printf(“输入a\n的值”);
scanf(“%c”和“&a”);
如果(a='Y')
{
printf(“输入此问题是否愚蠢或否Y/N\N”);
scanf(“%c”和“b”);
}
其他的
{
printf(“这太浪费时间了”);
}
printf(“输入c\n的值”);
scanf(“%c”、&c);
如果(c='Y')
{
printf(“如果我愚蠢或否,请输入?是/否\N”);
scanf(“%c”、&d);
}
其他的
{
printf(“我很快就会发疯的”\n);
}
}

我认为您可能因为换行符而出现问题。试用

 scanf(" %c", &var)

注意:我的原始答案是错误的,但已被接受,我从@teppic复制了此解决方案。

扫描字符后,您没有刷新缓冲区,当您输入字符并按enter键时,在下一次扫描中,您的enter键将被视为字符,这就是它跳过第二次扫描的原因。每次扫描后,使用以下任意一种uu fpurge(stdin)、fpurge(stdin),无论在您的系统上运行什么。它会起作用的

指定符
%c
告诉
scanf
只读取一个字符。当您键入一个字符并按enter键时,将提供两个字符。因此,下一个调用已经有一个字符要读取

为了使这项工作正常进行,您需要在读取字符之前跳过任何空格。按如下方式更改每个呼叫:

scanf(“%c”和&a)


现在,您之前输入的任何换行符都将被跳过。

我认为问题可能出在“if”语句的实现中。使用getchar()也尝试过。您面临的问题是(可以说)处理用户输入的唯一正确方法是
fgets()
一个完整的行(输入和全部),然后解析该行(例如
sscanf()
):如果给定的流是输入类型,那么函数的行为是未定义的。
fflush
只保证在输出流上工作。实现可能允许在输入流上使用它,但它不是标准的。@Lundin我为我的错误道歉,但我很确定u fpurge和fpurgepurge()不是标准的C。在我看来,这是最好的解决方案,因为它还丢弃了除“\n”之外的其他空格字符。@Lundin-scanf无论如何都会对所有空格一视同仁,如果键入“\n”,则不会区分它们。它只会丢弃换行符,是吗?@Lundin否,它也会丢弃空格和制表符。(这就是为什么被接受的答案是错误的——scanf将永远阻塞,忽略空格,直到您输入其他内容)。不能说我自己也试过,我使用scanf的几次,我总是使用“%c”符号。(我还认为printf/scanf函数是有史以来编写的最糟糕的库函数,但可能这只是我的问题。)@teppic你说得对,它确实工作不好。解决这个问题的最好方法是什么?我应该删除答案吗?你不需要删除它,你在这个问题上是对的。只需修正解决方案(我在答案中的内容很好)。是的,我知道,但那是你的答案,不是我的:)。@Martinsos-很好:)