【问题标题】:How do I read in a string and transfer to an array?如何读取字符串并传输到数组?
【发布时间】:2022-01-13 20:05:47
【问题描述】:

在这个 c++ 代码中,我从 std::cin 中获取一个字符串,并将每个 char 项传输到一个 char 数组中。

int length; // length of the string
cin >> length;

char charList[length]; // list of the characters
string sequence; // string sequence
cin >> sequence;
for (int i = 0; i < length; i++) {
    charList[i] = sequence[i];
}

我不确定这是否是正确的方法,或者我是否有问题。索引字符串之外的项目是char 还是string 类型?

【问题讨论】:

  • 为什么?当我使用int 时它总是有效,那么为什么它不适用于char 类型?
  • 这段代码应该做什么?为什么要询问长度而不是使用sequence.length()。还要记住cin &gt;&gt; 在第一个空格处停止读取。
  • 该代码应该是一个字符串,将第一个字符放入charList的第一项,其余相同。
  • 长度是有问题的,因为sequence 的长度可能与长度变量不同,这可能导致未定义的行为,并且确实不需要向用户询问长度。

标签: c++ arrays string char cin


【解决方案1】:

首先,回答您对类型的疑问:sequence[i] 属于 char 类型。

接下来,关于您的实现:首先,正如许多人在 cmets 中建议的那样,我建议不要将字符串的长度与字符串本身分开,因为输入字符串的长度可能与声明的不同长度,这可能会导致各种问题(听说过臭名昭著的错误heartbleed?)

所以,这是我要做的最低限度:

  string sequence; // string sequence
  cin >> sequence;
  char charList[sequence.length()]; // list of the characters
  for (int i = 0; i < sequence.length(); i++) {
      charList[i] = sequence[i];
  }

但是,这仍然不够令人满意,因为上面的代码不符合要求。换句话说,它不是有效的 C++,因为 C++ 并不真正允许变长数组。根据编译器的不同,你可能会逃脱,例如 g++ 接受它,请参阅https://stackoverflow.com/a/15013295/12175820

但即使使用 g++,如果您使用 -pedantic 标志进行编译,您也会收到以下警告:

str2arr.cpp:10:8: warning: ISO C++ forbids variable length array ‘charList’ [-Wvla]
   10 |   char charList[sequence.length()]; // list of the characters

-Werror 复合会产生全面的编译错误:

str2arr.cpp:10:8: error: ISO C++ forbids variable length array ‘charList’ [-Werror=vla]
   10 |   char charList[sequence.length()]; // list of the characters

另外,您可能无法使用更高级的用法,例如我刚刚发现 typeid(charList) 无法使用可变长度数组进行编译...

所以在 C++ 中真正的方法是在堆中使用指针和动态内存分配,使用运算符new:

  string sequence; // string sequence
  cin >> sequence;
  char* charList = new char[sequence.length()]; // list of the characters
  for (int i = 0; i < sequence.length(); i++) {
      charList[i] = sequence[i];
  }

以上代码是任何编译器都接受的有效 C++。

【讨论】:

  • 谢谢,效果很好。
猜你喜欢
  • 2021-02-20
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
相关资源
最近更新 更多