使用“%s”格式说明符在单个字符中读取时scanf的行为是什么?

时间:2013-09-24 12:58:06

标签: c scanf

#include <stdio.h>

int main(void){

char a;
scanf("%s", &a);

return 0;
}

适合我,但我想知道在其他情况下是否会有任何意外结果。

2 个答案:

答案 0 :(得分:1)

以此代码为例 -

#include <stdio.h>

int main(void){

    char a;
    char b = '1';
    char c = '1';
    scanf("%s", &a);

    printf("%c = %c\n", b, c);
    return 0;
}

你会期望它打印1 = 1,但就在我运行它时,它打印= 1(至少在我的编译器中,不要指望它有任何稳定性)

scanf将字符串写入a的地址,期望在那里分配足够的空间(在这种情况下这是错误的),此字符串具有输入char和null终止符。在我的例子中,null终止符覆盖了一些其他内存 - b。这是未定义的行为 - 不要这样做(至少不要期望它有任何意义)。

答案 1 :(得分:1)

使用格式%c匹配单个char,或使用%s匹配字符串。

将它们混合(就像在代码中一样)是未定义的行为,可能发生任何事情