【问题标题】:How cin change the declared size of string?cin 如何改变声明的字符串大小?
【发布时间】:2021-02-27 10:21:37
【问题描述】:

我正在尝试将自己的大小设置为字符串数组。 cin如何覆盖字符串的大小。

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
  int size; cin>>size;
  char str[size];
  cout << "Enter a string: ";
  cin>> str;
  cout << "string size: " << strlen(str);
  return 0;
}

输出:

5
Enter a string: hellobaby
string size: 9

【问题讨论】:

  • size 是您为长度不超过size -1 的字符串保留的大小。 size 可能是 1024,而 ”test” 的长度是 4(加一表示结尾为空);其余 1019 个字符未使用。阅读以 null 结尾的字符串。
  • 这有点像苹果和橘子的比较。包含以空字符结尾的字符串的数组的大小和以空字符结尾的字符串的大小是独立的、不相关的量。 (理想情况下,string size &lt; array size 的关系成立,但不是必须的。这是在 C++14 中删除 std::gets 的一个重要原因。) 所以cin 并没有真正覆盖任何东西的大小。或许你可以改写一下这个问题,问为什么cin 不受数组大小的限制?

标签: c++ arrays string


【解决方案1】:

在这里您创建一个大小为 5 的 VLA(给定问题中的输入:

int size;
cin >> size;
char str[size];

然后你继续输入一个比这更长的字符串:

cin>> str; // hellobaby

该字符串现在已超出范围,因此您的程序具有未定义的行为。任何事情都有可能发生。

您可以使用std::string,而不是使用非标准 VLA:s

#include <string>

unsigned size;
cin >> size;
std::string str;
cin >> str;
str.resize(std::min(str.size(), size));

【讨论】:

  • C++20 增加了对这种越界读取的保护:en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2
  • @HolyBlackCat 真的。我猜 OP 还没有使用 C++20,因为它写得越界——或者它可能不适用于 VLA:s。我不太擅长 VLA:s。
  • 恕我直言,没有人应该“擅长 VLA”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多