使用for循环以相反的顺序将字符串值分配给char数组

时间:2019-06-26 09:03:38

标签: c++

我正在编写一个程序,该程序读取用户输入并将值存储在字符串中。该值应该分配给两个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: 

3 个答案:

答案 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时,可以访问字符串末尾之外的内容。

您需要运行循环,然后然后(在循环之后)在reversedchar 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';