首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >scanf("%c",&c)和scanf(“%c",&c)的区别

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

Stack Overflow用户
提问于 2013-08-28 22:54:33
回答 3查看 33.1K关注 0票数 8

考虑下面的C代码片段:

代码语言:javascript
运行
复制
#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);
}

我只能输入整数,而不能输入。character.The的输出仅仅是整数值,第二个printf语句没有输出值。

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

代码语言:javascript
运行
复制
scanf(" %c",&c);

它的工作方式与预期一致。为什么会这样呢?

有人告诉我这与清除输入缓冲区有关。有没有人能解释一下这件事?

EN

回答 3

Stack Overflow用户

发布于 2013-08-28 22:56:56

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

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

顺便说一句,如果您输入的是紧跟在回车之后的整数,那么程序的输出将以两个换行符结尾:第一个换行符是c,第二个换行符是格式字符串。因此,您可能会看到:

代码语言:javascript
运行
复制
$ ./your_program
123
int=123
char=

$

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

代码语言:javascript
运行
复制
$ ./your_program
123xyz
int=123
char=x
$

整数输入在读取'x‘时停止;因此字符输入读取’x‘。

票数 8
EN

Stack Overflow用户

发布于 2013-08-28 22:57:46

因为在您输入数字并按ENTER键之后,新行将保留在缓冲区中,并将由第二个scanf处理。

简而言之,您在变量c中保存了新行。

但是,如果您使用

代码语言:javascript
运行
复制
scanf(" %c",&c);
//     ^

空格将占用新行,这将使c成为您所期望的值。

票数 2
EN

Stack Overflow用户

发布于 2013-08-28 22:59:49

您必须传递一个指向格式字符串指定的数据对象的指针,因此

代码语言:javascript
运行
复制
scanf("%c", c);

将实际传递c的值,这反过来可能导致程序错误,

代码语言:javascript
运行
复制
scanf("%c", &c);

将传递c的地址,允许scanf更改副本的值。

%c后面的空格将强制它先查找字符,然后再查找空格。如果没有空格,它将不会读取字符

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18491390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档