为什么“scanf()”函数将%s和%c视为同一类型?

为什么“scanf()”函数将%s和%c视为同一类型?,c,string,char,scanf,C,String,Char,Scanf,我不明白为什么这两条语句都打印相同的值1 据我所知,scanf()。那么,这不是不匹配的情况吗 我错过了什么 定义如下 char c; printf("%d", scanf("%s", &c)); // prints 1 printf("%d", scanf("%c", &c)); // prints 1 使用 原因。*因此,无法以任何方式证明输出的合理性 注意:%s格式说明符要求相应的参数是指向足够长度的字符数组的指针。否则,将出现内存边界溢出,这将导致UB 引用与%s

我不明白为什么这两条语句都打印相同的值
1

据我所知,
scanf()。那么,这不是不匹配的情况吗

我错过了什么

定义如下

char c;
printf("%d", scanf("%s", &c)); // prints 1  
printf("%d", scanf("%c", &c)); // prints 1
使用

原因。*因此,无法以任何方式证明输出的合理性


注意:
%s
格式说明符要求相应的参数是指向足够长度的字符数组的指针。否则,将出现内存边界溢出,这将导致UB

引用与
%s
格式说明符相关的
C11
标准第§7.21.6.2章

[…]相应的论点应为a 指向字符数组的初始元素的指针,该元素的大小足以接受 序列和一个将自动添加的终止空字符

%s和%c用于不同的类型

这是不正确的。它们都期望相同的类型:
char*


“%c”
需要一个指向1
char
char*

“%s”
需要一个
字符*
,该字符指向一个足够容纳字符串的数组。这至少需要2个字符。OP代码很可能写入过去的
c
。写过变量的空间是未定义的行为


反而

scanf("%s", &ch);  // "" s added

当在
scanf
函数族中使用时,格式说明符
%c
%s
都需要类型为
char*
的参数

不同之处在于,使用
%c
将最多读取一个字符,而使用
%s
将读取找到的所有非空白字符。当使用
%s
时,它还将向指针添加一个终止空字符

给定

使用

是一个问题,因为
&c
只有一个可以写入的有效字符。因此,它会导致使用程序不应该使用的内存,从而导致未定义的行为

事实是

scanf("%s", &c);

打印
1
而不是崩溃是运气不好的问题。如果程序崩溃了,那就太好了。那你就知道程序错了。

@Kapanoglu,我想不完全是这样。更多的是当说明符不正确时,
scanf
的行为。@kapanoglu我在这里发布之前已经读过了,但无法得到我的答案。这绝对不是一个重复的问题。在提出的问题中,确实有人在问这两个项目之间的区别。在这个问题中,海报非常错误地假设格式的返回值为
scanf()
。复制是关于在
printf()
中使用
%s“
%c”
,而不是这里使用的
scanf()
。投票重新打开,因为虽然相关,但不适用。这是无效代码。关于
“%s”
的功能的良好/重要详细信息。那么为什么在c@PrinceVijay Pratap为什么
char
存在?这是一个广泛的问题。因此,我们可以一次使用1
char
进行编码。使用
scanf(%c,&ch)
读取1
char
scanf(%9s,s)
最多读取9
char
并形成字符串。
char s[10];
printf("%d", scanf("%9s", s));
char c;
printf("%d", scanf("%c", &c));
char c;
scanf("%s", &c);
printf("%d", scanf("%s", &c))