如何读取字符串并传输到数组?

How do I read in a string and transfer to an array?

在此 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];
}

我不确定这样做是否正确,或者我是否遇到了错误。项目是否在索引字符串 charstring 类型之外?

首先回答你对类型的疑惑:sequence[i]是类型char.

接下来,关于您的实现:首先,正如许多人在评论中所建议的那样,我建议不要将字符串的长度与字符串本身分开,因为输入字符串的长度可能与声明的长度,这可能会导致各种问题(听说过臭名昭著的错误 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++ 接受它,请参阅

但即使使用 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++。