繁体   English   中英

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

[英]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时,您将访问字符串末尾之外的一个。

您需要运行循环, 然后 (在循环之后)在inputreversed的末尾添加一个空终止符。

您还需要在该空终止符的变量中保留空间。

最后,您应该意识到:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM