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

时间:2019-01-10 11:19:48

标签: c string scanf

我正在尝试使用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打印正确的字符串,而第二个打印{{1} }。

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

1 个答案:

答案 0 :(得分:2)

在C中,字符串以\0字符结尾。如果您的matrikelnumber应该是8位数字,则需要9个字符来存储它:内容的8个字符,结尾\0的1个字符。

只需更改此行:

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。因此,当您现在打印matrikelnumber时,printf一直输出直到找到\0:以前标记matrikelnumber结束的那个已被删除,{{ 1}}紧随其后,并且该字符串的末尾确实有first_name