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()在早期匹配失败的情况下,返回成功匹配和分配的输入项的数量,甚至为零.那么这不是不匹配的情况吗?
我在这里想念的是什么?
格式说明符%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而不是崩溃是运气不好的问题.程序崩溃本来会很好.那你就知道程序错了.
%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)