这段代码是如何工作的因为我只输入了一个整数?

问题描述

我试图制作一个获取整数作为输入的代码。我找到了一个可行的解决方here

int n,input,temp,status;

printf("Height:");
status = scanf("%d",&n);

while(status!=1)
{
    while((temp=getchar()) != EOF && temp != '\n');
    printf("Height:");
    status = scanf("%d",&n);
}

我想知道究竟是什么让这部分工作以及那些“额外的隐藏字符”是什么

while((temp=getchar()) != EOF && temp != '\n');

谁能解释一下吗?

解决方法

while((temp=getchar()) != EOF && temp != '\n');

首先,您需要了解getchar函数的作用,即:

C 库函数 int getchar(void) 获取一个字符(一个无符号的 char) 来自标准输入。

返回值 此函数返回读取为无符号字符的字符,转换为 int 或 > EOF 在文件末尾或错误。

当用户输入将由 scanf 选择的内容时,用户按下 [enter] 将发送一个“\n”。 scanf 函数不会读取该换行符,而是保留在输入缓冲区中。 EOF 用于某人明确关闭流的情况,例如按 CTRL-Z。所以代码:

 while(status!=1)
    {
        while((temp=getchar()) != EOF && temp != '\n');
        printf("Height:");
        status = scanf("%d",&n);
    }

首先检查 scanf 的返回类型值:

返回值 成功时,函数返回 参数列表成功读取。如果发生读取错误或 读取时到达文件尾,设置正确的指示器 (feof 或 ferror) 并且,如果任何一个发生在任何数据之前 读取成功,返回EOF。

在您的情况下,您希望读取单个数值 (i.e.,status = scanf("%d",&n);)。循环的其余部分基本上是要求用户提供有效的输入(ie,一个数值),从而导致 status1,退出最外层的 while 循环。

,

如果用户输入了一些非数字输入(例如 foo 而不是整数),则 scanf will return 0离开非数字输入在输入缓冲区中。

因此,下次您调用 scanf 时,它会尝试读取完全相同的非数字输入并再次失败。

循环

while((temp=getchar()) != EOF && temp != '\n');

将逐个字符读取,直到到达文件结尾,或者字符是换行符。循环读取的字符将被忽略并丢弃。

这是一种跳过用户可能输入的所有非数字输入的方法。

,

当没有更多输入时接收到 EOF 字符。在输入是从真实文件中读取的情况下,该名称更有意义,而不是用户输入(这是文件的特殊情况)。 这意味着当您收到 EOF 或用户按 Enter 时,您的循环将中断,在这种情况下,您会收到一个 '\n'。