Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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
getchar函数以清除while条件之外的输入缓冲区?_C_Getchar - Fatal编程技术网

getchar函数以清除while条件之外的输入缓冲区?

getchar函数以清除while条件之外的输入缓冲区?,c,getchar,C,Getchar,我了解到可以像这样清空输入缓冲区: while((ch = getchar()) != EOF && ch != '\n'); if (ch == EOF) { // oops } 那么,为什么我不能用一个字符来清空缓冲区 c = getchar(); 此行将导致程序等待用户输入。背景: void strfuncs() { char name[50] = {0}; char lastname[50] = {0}; char c; pr

我了解到可以像这样清空输入缓冲区:

while((ch = getchar()) != EOF && ch != '\n');
if (ch == EOF) {
    // oops
}
那么,为什么我不能用一个字符来清空缓冲区

c = getchar();
此行将导致程序等待用户输入。背景:

void strfuncs()
{
    char name[50] = {0};
    char lastname[50] = {0};
    char c;

    printf("Enter name...:");
    fgets(name, 50, stdin);
    printf("Enter last name...:");
    fgets(lastname, 50, stdin);

    c=getchar();
    printf("Enter a character...:");
    fgets(&c, 1, stdin);

    printf("c: %c",c);
}
如果存在缓冲区,则会将缓冲区清空一个字符。然而,考虑到人类输入的速度相对于计算机运行的速度,当该行被执行时,缓冲区很可能是空的。如果缓冲区为空
getchar
将等待缓冲区为空

while((ch = getchar()) != EOF && ch != '\n');
上述情况也不例外。大多数情况下,计算机将在
getchar
内等待缓冲区变为非空

在正常模式下,当标准输入来自终端时,操作系统仅在接收到新行字符时向程序的输入缓冲区发送字符,或者,如果用户被迫键入
ctrl-D
(在*nixes上,不确定Windows上的等效字符是什么)。循环实际上会在第一个
getchar()
中阻塞,直到您键入整行并按下return。然后,它将尽可能快地在循环中旋转,消耗您键入的所有字符。这一切都发生在您按下返回键之后

char c;        // <<<< Wrong!
c = getchar();
charc;//
如果存在缓冲区,则会将缓冲区清空一个字符。然而,考虑到人类输入的速度相对于计算机运行的速度,当该行被执行时,缓冲区很可能是空的。如果缓冲区为空
getchar
将等待缓冲区为空

while((ch = getchar()) != EOF && ch != '\n');
上述情况也不例外。大多数情况下,计算机将在
getchar
内等待缓冲区变为非空

在正常模式下,当标准输入来自终端时,操作系统仅在接收到新行字符时向程序的输入缓冲区发送字符,或者,如果用户被迫键入
ctrl-D
(在*nixes上,不确定Windows上的等效字符是什么)。循环实际上会在第一个
getchar()
中阻塞,直到您键入整行并按下return。然后,它将尽可能快地在循环中旋转,消耗您键入的所有字符。这一切都发生在您按下返回键之后

char c;        // <<<< Wrong!
c = getchar();

charc;// 这种清空输入流的习惯用法只有在输入流中有字符需要读取时才起作用;否则,
getchar()
将阻塞,等待输入。如果输入流中有字符,
getchar()
将读取其中一个字符

fgets()
函数保留换行符,因此在以这种方式获得一行输入后,似乎不需要清理输入流。但是,如果缓冲区不够大,就会留下一些字符。处理此问题的一种方法是检查输入缓冲区中是否有换行符,如果不存在,则清除输入流。如果在输入缓冲区中找到换行符,则通常会将其删除:

char buffer[1000];

puts("Enter a line:");
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
    perror("Error in fgets()");
    exit(EXIT_FAILURE);
}

char *ch;
int c;
if ((ch = strchr(buffer, '\n')) == NULL) {
    while ((c = getchar()) != '\n' && c != EOF) {
        continue;
    }
} else {
    *ch = '\0';
}

请注意,应使用
int
变量来接收
getchar()
返回的值,以确保正确处理
EOF

此清空输入流的习惯用法仅在输入流中有要读取的字符时有效;否则,
getchar()
将阻塞,等待输入。如果输入流中有字符,
getchar()
将读取其中一个字符

fgets()
函数保留换行符,因此在以这种方式获得一行输入后,似乎不需要清理输入流。但是,如果缓冲区不够大,就会留下一些字符。处理此问题的一种方法是检查输入缓冲区中是否有换行符,如果不存在,则清除输入流。如果在输入缓冲区中找到换行符,则通常会将其删除:

char buffer[1000];

puts("Enter a line:");
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
    perror("Error in fgets()");
    exit(EXIT_FAILURE);
}

char *ch;
int c;
if ((ch = strchr(buffer, '\n')) == NULL) {
    while ((c = getchar()) != '\n' && c != EOF) {
        continue;
    }
} else {
    *ch = '\0';
}
请注意,应使用
int
变量来接收
getchar()
返回的值,以确保正确处理
EOF
-->
intc“此行将导致程序等待用户输入”,因此((ch=getchar())!=EOF&&ch!='\n')
as
fgets
不会将换行保留在输入缓冲区中,而是使用它并将其存储在第一个参数中。
fgets(&c,1,stdin)是个坏主意。在这里使用
c=getchar()
-->
intc“此行将导致程序等待用户输入”,因此((ch=getchar())!=EOF&&ch!='\n')
as
fgets
不会将换行保留在输入缓冲区中,而是使用它并将其存储在第一个参数中。
fgets(&c,1,stdin)是个坏主意。在这里使用
c=getchar()