我正在编写一个程序,该程序读取用户输入并将值存储在字符串中。该值应该分配给两个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:
答案 0 :(得分:3)
从C ++ 11开始,像这样复制包含null终止符的整个字符串是正确的(在访问rest
之前是未定义的行为)。但是,在反转字符串时,您还应包含该空终止符。因此,空终止符是反向字符串中的第一个字符。这意味着该字符串将被视为空。
相反,我将循环更改为此:
strok_r
复制不带空终止符的字符串,然后您可以手动设置它们:
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
是所谓的可变长度数组,它不是C ++的一部分,但是一些编译器仍然允许它。如果使用其他编译器编译程序,则可能无法正常工作。
答案 1 :(得分:2)
编辑:对于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];
的末尾添加一个空终止符。
您还需要在变量中为该空终止符保留空格。
最后,您应该意识到:
std::string
实际上不是合法的C ++。数组维数必须是编译时间常数。有许多解决此问题的方法:
std::string
。保留文本是std::vector
的 。react-native-fast-image
。这是一个很好的解决方案,可以解决保存某物的可变大小数组的一般问题。答案 2 :(得分:1)
[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';