我正在尝试使用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个字符串正确保存在相应的变量中?
答案 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
。