首页 > 解决方案 > C扫描输入字符串保存到错误的变量

问题描述

我正在尝试使用 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);

如果我输入12345678formatrikelnumberNameforlast_name第一个printf打印正确的字符串,而第二个打印12345678Name.

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

标签: cstringscanf

解决方案


在 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最后的那个存储在那个数组的末尾之后,正好和的位置重合

char first_name[S_FIRST_NAME]; //S_FIRST_NAME is 30

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


推荐阅读