繁体   English   中英

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

[英]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类型。

接下来,关于您的实现:首先,正如许多人在评论中所建议的那样,我建议不要将字符串的长度与字符串本身分开,因为输入字符串的长度可能与声明的长度不同,并且这可能会导致各种问题(听说过臭名昭著的 bug 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++ 并不真正允许可变长度 arrays。 根据编译器的不同,您可能会摆脱它,例如 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++ 中执行此操作的真正方法是在堆中使用指针和动态内存分配,使用 operator 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++。

我认为lengthunsignedsize_t可能比 int 更好。 目前,如果长度的输入是 0 或负数,可能会发生意想不到的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM