【问题标题】:Using Scanf() for taking input for both string and integer [duplicate]使用 Scanf() 获取字符串和整数的输入 [重复]
【发布时间】:2021-05-15 07:16:11
【问题描述】:

我正在编写一个简单的 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 [2] 太小,无法包含 2 个字母 + 1 个空终止符,请参阅链接副本。

标签: arrays c string scanf format-specifiers


【解决方案1】:

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

就目前而言,您有未定义的行为 - 这可能包括覆盖为b 给出的值(零应该是nul-terminator)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多