gpt4 book ai didi

C 扫描输入字符串保存到错误的变量

转载 作者:行者123 更新时间:2023-11-30 20:53:00 25 4
gpt4 key购买 nike

我尝试使用 scanf 在 C 语言的控制台上扫描 3 个字符串,但每次扫描第二个字符串时,它也会添加到第一个字符串的末尾。

我已经尝试更改 scanf 格式参数(%8s, %[^\n]s, %8[^\n]s) 但没有任何效果。看来%8s忽略了第二个scanf并直接跳转到第三个。

char matrikelnumber[S_MATRIKELNUMBER]; //S_MATRIKELNUMBER is 8
char first_name[S_FIRST_NAME]; //S_FIRST_NAME is 30
char last_name[S_LAST_NAME]; //S_LAST_NAME is 30

printf("Matrikelnummer: ");
scanf("%s", matrikelnumber);

printf("%s\n", matrikelnumber); //Prints the correct input

printf("Vorname: ");
scanf("%s", first_name);

printf("%s\n", matrikelnumber); //Prints matrikelnumber + first_name added at the end

printf("Nachname: ");
scanf("%s", last_name);

如果我输入 12345678 作为 matrikelnumber 并输入 Name 作为 last_name 第一个 printf 打印正确的字符串,而第二个打印 12345678Name

如何将所有3个字符串正确保存在相应的变量中?

最佳答案

在 C 语言中,字符串以 \0 终止。特点。如果您matrikelnumber应该是8位数字长,你需要9个字符来存储它:8个字符用于其内容,加上1个字符作为结尾 \0 .

只需更改这一行:

char matrikelnumber[S_MATRIKELNUMBER + 1]; //S_MATRIKELNUMBER is 8

发生这种情况的原因:

printf("%s\n", matrikelnumber); //Prints matrikelnumber + first_name added at the end

是读取并存储matrikelnumber,占用8+1个字符,\0 at the end 存储在该数组末尾之后,恰好与

的位置一致
char first_name[S_FIRST_NAME]; //S_FIRST_NAME is 30

然后您读取存储在该位置的名字,它的第一个字符会覆盖 \0之前存储在那里。因此,当您现在打印 matrikelnumber 时, printf不断输出,直到找到 \0 :之前标记 matrikelnumber 结尾的那个已被删除并且 first_name紧随其后,该字符串确实有 \0在最后。

关于C 扫描输入字符串保存到错误的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54127568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com