将字符串值分配给Char数组以相反的顺序进行循环

Assign string values to char array in reversed order with for loop

本文关键字:顺序 循环 字符串 分配 数组 Char      更新时间:2023-10-16

我正在编写一个读取用户输入并将值存储在字符串中的程序。该值应该分配给两个char阵列,其中一个应以相反的顺序保存字符。但是,当我运行程序时,反向数组中的值不会出现在终端中。我还想指出,我正在不使用指针而尝试实现这一目标。

我尝试使用单独的循环使用静态int,该静态int被每次迭代1的递增[str.length((]递增,但结果保持不变。我已经测试了一个一个一个一个一个一个一个一个,以某种方式以这种方式显示的字符。我认为这些值毕竟分配给数组,但是在尝试一次输出整个文本字符串时并未显示。关于为什么这将不胜感激的解释!

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: 

复制整个字符串,包括这样的null末端是正确的,因为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()] = '';
reversed[str.length()] = '';

另外,由于char数组需要保持空末端,因此其长度应为str.length()+1


在侧节点上,char input[str.length()];是一个所谓的可变长度数组,不是C 的一部分,但是有些编译器仍然允许它。如果您使用其他编译器编译程序,则可能行不通。

编辑:以下答案是C 11及以后的错误。但是,有一些有用的讨论"需要分配空间"answers"可变长度阵列不是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用于存储字符串终止字符。因此,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()] = ''; reversed[str.length()] = '';