[英]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];
}
我不确定这是否是正确的方法,或者我是否有问题。 项目是否超出索引字符串char
或string
类型?
首先,回答您对类型的疑问: 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++。
我认为length
为unsigned
或size_t
可能比 int 更好。 目前,如果长度的输入是 0 或负数,可能会发生意想不到的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.