c - 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);
如果我输入12345678
formatrikelnumber
和Name
forlast_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
最后的那个存储在那个数组的末尾之后,正好和的位置重合
char first_name[S_FIRST_NAME]; //S_FIRST_NAME is 30
然后您读取存储在该位置的名字,并且它的第一个字符会覆盖\0
之前存储在那里的名字。所以,当你现在正在打印时matrikelnumber
,printf
一直输出直到它找到一个\0
:之前标记结束的那个matrikelnumber
已经被删除并且first_name
紧随其后,并且这个字符串\0
的末尾确实有一个。
推荐阅读
- java - 使用java分区负正不与0比较
- redux - Redux Toolkit - 重置状态
- python - 想知道为什么 scipy.spatial.distance.sqeuclidean 比 numpy.sum((y1-y2)**2) 慢两倍
- python - 如何在python中并行集成for循环以在CLUSTER中运行
- javascript - MathUtils.euclideanModulo 的用途是什么,它与常规模数有何不同?
- python - 仅从浏览器中打开的页面获取数据
- xamarin - 如何在 Xamarin.UITest 项目中使用 WireMock.Net?
- android - 如何在android studio中指定另一个api级别的SDK源代码
- babeljs - core-js 无法解析 core-js/modules/es6.typed.uint32-array
- typescript - 持有类方法的泛型类型,带有该方法的参数