使用 Scanf() 获取字符串和整数的输入

Using Scanf() for taking input for both string and integer

我正在编写一个简单的 C 程序来使用 scanf() 从用户那里获取不同变量的输入,如下所示:

#include <stdio.h>
int main(){
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n",a);
    printf("%d\n",b);
    return 0;
}

正如预期的那样,此输出完全正常:

input: 10 23
output: 10
        23

但是后来我也尝试了一个字符串数组的输入,如下(这里char c[2]是一个字符串数组):

#include <stdio.h>
int main(){
    int a, b;
    char c[2];
    scanf("%d %d %s", &a, &b, c);
    printf("%d\n",a);
    printf("%d\n",b);
    printf("%s\n",c);
    return 0;
}

现在输出出乎意料:

input: 10 23 AM
output: 10
        0
        AM

在这里,可以看出为变量 b 打印的值将变为 0,而不是预期的 23。获取字符串数组的输入如何更改变量 b 的值?

谁能帮忙弄清楚,我做错了什么(当然是愚蠢的错误)?强调文字

您的 char c[2]; 变量数组不够大,无法容纳 2 个字符的字符串 加上所需的 nul-终止符 。如果您知道输入不会超过2个字符,那么更改为char c[3];应该就足够了;但是,为了增加安全性,您可以限制 scanf 调用将读取的字符数,使用 %2s 之类的格式说明符(或者更一般地,对于数组 char buff[n]; 在该格式说明符中使用 n - 1 的值。

就目前而言,您有 未定义的行为 – 这可能包括覆盖b 的值(零应该是 nul 终止符)。