【问题标题】:Reading a string in C++ using scanf [duplicate]使用scanf在C ++中读取字符串[重复]
【发布时间】:2014-02-17 21:18:48
【问题描述】:

我正在尝试使用 scanf 读取 C++ 中的字符串。我试过了

char cmd[40];
scanf("%s", cmd);
string str(cmd);

但这给了我一个我想要的字符串加上一些无意义的字符。

【问题讨论】:

  • 为什么在 C++ 中使用 scanf?还要使用有限的 scanf 字符串,所以你不能用完预分配的数组。
  • 你的测试输入是什么,你得到了什么?因为我绝对不能复制这个。
  • 实际上,请确保您输入的符号不超过 39 个...需要为终止 \0 留出空间...
  • @herohuyongtao 仅仅因为当您输入一个长度超过您分配的 39 字节加上终止符空间的字符串时您的程序不会立即崩溃和烧毁并不意味着它是正确的。那是真正的未定义行为......你很幸运。

标签: c++ string char scanf


【解决方案1】:

带有%s 说明符的scanf 将在输入字符串之后存储一个空终止符,以防止垃圾字符进入字符串...除非您的代码具有未定义的行为。

您的问题可能是输入溢出缓冲区,导致未定义的行为;在没有适当缓冲区大小的情况下使用%s 说明符时,scanf 可能会写入缓冲区边界之外。此时,您无法保证程序的行为方式。

在没有提供缓冲区大小的情况下,切勿将%sscanf 一起使用:

char cmd[40];
scanf("%39s", cmd);
string str(cmd);

【讨论】:

  • 对不起。我可能还不够清楚。我不知道字符串的精确大小。我只知道最多40。
  • @user2062607: 然后将缓冲区设为 41
  • @user2062607 您给 scanf 的缓冲区大小是它将读取的最大值。如果输入字符串较短,则 scanf 将在此之前停止。正如 Mooing Duck 所说,如果字符串可以是 40 个字符长,那么有一个 41 个字符的缓冲区并告诉 scanf 最多读取 40 个字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多