【问题标题】:Why is my variable being assigned to 0 to despite the user input?尽管有用户输入,为什么我的变量被分配为 0?
【发布时间】:2019-10-09 16:56:48
【问题描述】:

我正在用 C 语言设置一个程序,该程序在用户输入转换和单元格的数量时操作字符串,以及他们想要操作的字符串以及起始字符串和“初始字符串”

用户将逐行输入信息,所以我决定使用“scanf”,但是,我的所有变量似乎都可以工作,除了转换的整数,尽管用户输入,它一直被赋值为 0。

int main()
{
    int num;
    int changes;
    char string[10];
    char startingString[25];

    scanf("%d", &num);
    scanf("%d", &changes);
    scanf("%s", string);
    scanf("%s", startingString);

    printf("number: %d\n",num);
    printf("Changes: %d\n",changes);
    printf("String: %s\n",string);
    printf("String Before: %s\n", startingString);
}
input:
20
10
teststring
goodbye

output:
20
0 <----
hello
goodbye

【问题讨论】:

  • 如果您检查了scanf 的返回值,将会有所帮助。在所有情况下都应该是 1。
  • 不应该指定和消费换行符吗?人们过于依赖scanf。读取原始缓冲区并进行解析,即使使用strtok,也可能是一种更好的方法。
  • @tadman scanf 跳过空格,所以换行应该不是问题
  • 如果这是C,您需要#include 相应的标头。如果不包含标头,程序的行为可能会发生变化。
  • 如果在main 末尾添加return 0 还会出现这种情况吗?

标签: c scanf undefined-behavior c-strings


【解决方案1】:

连续两次 scanf() 是这里的问题。变量一旦看到就会被覆盖

【讨论】:

    【解决方案2】:

    对于您显示的输入数据,我无法重现程序的行为。

    然而scanf这样的调用

    scanf("%s", string);
    

    不安全。

    因此,当您输入变量 string 时,您可能会覆盖变量 changes

    使用scanf这样的调用

    scanf("%s", string);
    

    您必须输入少于 10 个字符(或更一般地少于 sizeof(string)),因为该函数会将终止零附加到存储在参数中的输入字符序列。

    【讨论】:

    • 这就是答案。我完全忘了考虑终止字符。谢谢。
    • @hydra-bslash-0 -- 给出的建议是正确的,但我仍然不明白鉴于您在问题中陈述的输入,您怎么会出错。有些东西没有加起来......
    • @hydra-bslash-0 但是您的示例显示“hello”和“goodbye”作为输入,它们都足够短,终止字符不应该成为问题。
    • 是的......我立即怀疑缓冲区溢出,但被据称用于测试的过小字符串推迟了:(
    猜你喜欢
    • 2020-07-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多