char c;
scanf("%s",&c);
这是对还是错?在stdin中输入EOF
字符时究竟发生了什么?
我知道有类似的东西,但我找不到它?
我已经知道完全正确的表格应该是:
scanf("%hhd",&c);
答案 0 :(得分:2)
不,这不正确。
虽然看起来将地址发送到char(&c
)可能是等效的,但它与“string”不同。
当然,C实际上没有字符串类型;相反,我们在标准库字符串和printf样式函数中找到了一个抽象,它使用字符指针的约定来指向字符串末尾的空字节(空终止符)的一组字节。
如果您告诉scanf
读取"%s"
然后提供char &
,则分配将仅为一个字节。即使输入只是一个字节,它也会以空值终止(附加到末尾的额外字节),自动导致缓冲区溢出。
答案 1 :(得分:0)
这是错误的。你不能在char
中放一个字符串。这是未定义的行为,可能会导致内存踩踏。
scanf("%c", &c);
是您从char
获取scanf
的方式。
更好的是,完全避免使用scanf()
并使用getchar()
:
int c = getchar();
请注意返回类型。
答案 2 :(得分:0)
使用char c;scanf("%s",&c).
显然是错误的。格式说明符"%s"
读入一系列非空白字符,并在末尾添加'\0'
(参见cppreference concerning scanf)。所以它很可能超过单个字符char c
提供的内存(除非用户只按下return或ctrl-d)。
请改用char c;scanf("%c",&c).
。