c - scanf ("%c", &c) 和 scanf ("%c", &c) 的区别

标签 c scanf

<分区>

考虑以下 C 代码片段:

#include <stdio.h>

int main()
{
    int a;
    char c;
    scanf("%d",&a);
    scanf("%c",&c);
    printf("int=%d\n",a);
    printf("char=%c\n",c);
}

我只能输入整数,不能输入字符。输出只是整数值,第二个 printf 语句没有输出任何值。

但是,如果我在格式说明符前使用一个空格:

scanf(" %c",&c);

它按预期工作。为什么会这样?

有人告诉我这与清除输入缓冲区有关。有人可以阐明同样的问题吗?

最佳答案

scanf("%c", &c1)scanf("%c", &c2)的区别在于没有空格的格式读取下一个字符,即使它是空格,而带有空格的字符会跳过空格(包括换行符)并读取下一个不是空格的字符。

scanf() 格式中,空白、制表符或换行符表示“如果有要跳过的空白,则跳过空白”。它不会直接“清除输入缓冲区”,但它确实会吃掉任何看起来类似于清除输入缓冲区的空白(但与之截然不同)。如果你在 Windows 上,使用 fflush(stdin) 清除输入缓冲区(空白和非空白字符);在 Unix 上并根据 C 标准,fflush(stdin) 是未定义的行为。

顺便说一句,如果您键入整数后紧接着回车,程序的输出将以两个换行符结束:第一个在 c 中,第二个在格式字符串中。因此,您可能已经看到:

$ ./your_program
123
int=123
char=

$

也就是说,scanf() 读取换行符作为其输入。考虑另一种输入:

$ ./your_program
123xyz
int=123
char=x
$

整数输入在读到'x'时停止;因此,字符输入读取“x”。

关于c - scanf ("%c", &c) 和 scanf ("%c", &c) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18491390/

相关文章:

c - 小程序在接受输入后崩溃

c - 用于扫描 long unsigned int 的格式说明符

C++ 通过错误检查使 sscanf 代码适应 istringstream

c - 使用 Fscanf 解析特定的输入文件

无法让 fscanf 在简单程序中正确执行

C fscanf 返回 null

c - 使用 2D 矩阵的 MPI_Sendrecv 问题

计算用户输入数字的平均值

c - 使用 sscanf_s 时变量周围的堆栈已损坏

c - FTP 实现 : close data socket every time