【问题标题】:C scanning input strings saves to wrong variableC扫描输入字符串保存到错误的变量
【发布时间】:2019-01-10 11:19:47
【问题描述】:

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

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

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

【问题讨论】:

  • 请显示示例输入。
  • @Yunnosch 已添加到问题中

标签: c string scanf


【解决方案1】:

在 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

【讨论】:

  • 忘了说我已经试过了。但是现在我发现了我的错误:我还将字符串保存在一个结构中,在这里我还必须将字符串的大小增加 1。我的错误非常愚蠢......谢谢!
猜你喜欢
  • 2011-08-23
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 2012-06-22
  • 2020-09-07
相关资源
最近更新 更多