为什么%s和%c被`scanf()`函数视为同一类型?

Pri*_*tap -1 c string scanf char

char c;
printf("%d", scanf("%s", &c)); // prints 1  
printf("%d", scanf("%c", &c)); // prints 1
Run Code Online (Sandbox Code Playgroud)

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

据我所知,scanf()在早期匹配失败的情况下,返回成功匹配和分配的输入项的数量,甚至为零.那么这不是不匹配的情况吗?

我在这里想念的是什么?

R S*_*ahu 6

格式说明符%c和在函数族中使用时%s期望类型的参数.char*scanf

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

特定

char c;
Run Code Online (Sandbox Code Playgroud)

运用

scanf("%s", &c);
Run Code Online (Sandbox Code Playgroud)

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

这个事实

printf("%d", scanf("%s", &c))
Run Code Online (Sandbox Code Playgroud)

打印1而不是崩溃是运气不好的问题.程序崩溃本来会很好.那你就知道程序错了.


chu*_*ica 5

%s and %c are used for different types

是不正确的.他们都期望相同的类型:char *.


"%c"期望一个char *指向1 char.

"%s"期望一个char *指向一个足够大的字符串数组.这需要至少2 char.OP代码可能会写过去c.写入变量的空间是未定义的行为.


代替

char s[10];
printf("%d", scanf("%9s", s));
char c;
printf("%d", scanf("%c", &c));
Run Code Online (Sandbox Code Playgroud)