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