[英]Assign string values to char array in reversed order with for loop
我正在编写一个程序,该程序读取用户输入并将值存储在字符串中。 该值应该分配给两个char数组,其中之一应该以相反的顺序保存字符。 但是,当我运行程序时,反向数组中的值不会显示在终端中。 我还想指出,我试图在不使用指针的情况下实现这一目标。
我尝试过使用一个单独的for循环以及一个静态int,该静态int每次迭代对reversed [str.length()]都加1,但结果保持不变。 我已经测试过逐一输出值,并且以某种方式将字符显示在终端中。 我认为这些值毕竟是分配给数组的,但是在尝试一次输出整个文本字符串时不会显示。 对此的解释将不胜感激!
Inside main():
string str;
cout << "Enter a word: ";
cin >> str;
cout << flush;
char input[str.length()];
char reversed[str.length()];
for(int i = 0; i <= str.length(); i++) {
input[i] = str[i];
reversed[i] = str[str.length() - i];
}
cout << "Your word: " << input << endl;
cout << "Reversed: " << reversed << endl;
Enter a word: hello Your word: hello Reversed:
像这样复制包含空终止符的整个字符串是正确的,因为C ++ 11(在访问str[str.size()]
之前是未定义的行为)。 但是,在反转字符串时,您还应包含该空终止符。 因此,空终止符是反向字符串中的第一个字符。 这意味着该字符串将被视为空。
相反,我将循环更改为此:
for (int i = 0; i < str.length(); i++) { // < instead of <=
input[i] = str[i];
reversed[i] = str[str.length() - i - 1]; // note the -1
}
它将复制没有空终止符的字符串,然后可以手动设置它们:
input[str.length()] = '\0';
reversed[str.length()] = '\0';
另外,由于char
数组需要保留null终端,因此其长度应为str.length()+1
。
在副节点上, char input[str.length()];
是一个所谓的可变长度数组,它不是C ++的一部分,但是一些编译器仍然允许它。 如果使用其他编译器编译程序,则可能无法正常工作。
编辑:以下答案对于C ++ 11及更高版本是错误的。 但是,对“需要分配空间”和“可变长度数组不是C ++”进行了一些有用的讨论。
你的问题是
for(int i = 0; i <= str.length(); i++) {
input[i] = str[i];
reversed[i] = str[str.length() - i];
}
请记住,访问str[0]
直到包括str[str.length()-1]
都是合法的(如果length
为零,则访问任何元素都是非法的)。
在循环的第一次迭代中,当您分配给reversed
时,您可以访问字符串末尾之外的一个。 在循环的最后一次迭代中,当您分配给input
时,您将访问字符串末尾之外的一个。
您需要运行循环, 然后 (在循环之后)在input
和reversed
的末尾添加一个空终止符。
您还需要在该空终止符的变量中保留空间。
最后,您应该意识到:
char input[str.length()+1];
char reversed[str.length()+1];
实际上不是合法的C ++。 数组维数必须是编译时间常数。 有许多解决此问题的方法:
std::string
。 保留文本是std::string
的作用 。 std::vector
。 这是一个很好的解决方案,可以解决持有可变大小的事物数组的一般问题。 [1]数组长度不正确。 数组的长度应比字符串的长度大1,以便正确终止将存储在数组中的字符串。 char input[str.length()]; //incorrect char reversed[str.length()]; //incorrect char input[str.length() + 1]; //correct char reversed[str.length() + 1]; //correct
[2]数组索引从0
开始。 因此,如果字符串的长度为5,则有效索引为0 to 4
。 索引5
用于存储字符串终止字符\\0
。 因此, for
循环应在索引0 to 4
。 for(int i = 0; i < str.length(); i++) //note "i < str.length()" { input[i] = str[i]; reversed[i] = str[str.length() - 1 - i]; //note -1 }
[3]现在,适当地NULL
终止字符串。 input[str.length()] = '\\0'; reversed[str.length()] = '\\0';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.