我的程序没有显示数组的内容。不知道我的程序是否颠倒了字符

时间:2014-03-23 19:33:52

标签: c++ arrays reverse

我想从一个数组中反转字符并将它们复制到新数组中,但它不起作用。这是我在c ++中的代码(我是初学者):

char *str1 = "ppC";

int sumofchar = 0;
while(*str1 != '\0') // THIS LOOP ADD NUMBERS OF CHARACTERS IN ARRAY
{
         sumofchar++;
         str1++; 
}
cout << sumofchar << endl; // THIS WRITES NUMBERS OF CHARACTERS (3)

int placeInArr = sumofchar-1; 

  //placeInArr is the last place (exept of '\0') in array 

int walker = 0;
char strNew[sumofchar]; //New array with 3 characters

while(placeInArr!=-1)  // THIS LOOP SHOULD WRITES CHARACTERS IN THE NEW ONE
{
    strNew[walker] = str1[placeInArr]; // In the first time: strNew[0]=str1[2]
    walker++;
    placeInArr--;
}

cout << strNew << endl; // This should write the new array with reverse characters, but it doesn't work.

4 个答案:

答案 0 :(得分:2)

首先是这段代码

char strNew[sumofchar]; //New array with 3 characters

不符合C ++。数组的大小应该是一个常量表达式。

C ++中的字符串文字也有常量数组的类型。所以你必须写

const char *str1 = "ppC";

然而,您的代码的主要问题是1)数组的大小应该更大

char strNew[sumofchar + 1]; //New array with 4 characters

2)并且数组必须具有终止零。所以在循环之后添加一个语句

while(placeInArr!=-1)  // THIS LOOP SHOULD WRITES CHARACTERS IN THE NEW ONE
{
    strNew[walker] = str1[placeInArr]; // In the first time: strNew[0]=str1[2]
    walker++;
    placeInArr--;
}

strNew[walker] = '\0';

3)在复制操作之前你必须写

str1 -= sumofchar;

顺便说一句,如果您只需要以相反的顺序输出数组,则可以使用标准算法std :: reverse_copy。例如

#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
   char s[] = "ppC";

   std::reverse_copy( s, s + sizeof( s ) - 1, std::ostream_iterator<char>( std::cout ) );
   std::cout << std::endl;
}    

答案 1 :(得分:1)

您将原始指针增加到字符串,因此str1[2]不再是您认为的那样。

如果你真的想对改变后的strlen进行操作,可以使用char*或附加变量进行计数,也可以使用指针算法。请注意,在对字符串进行操作时,通常会使用std::string而不是char*

使用strlen

的示例
int sumofchar = std::strlen(str1);

使用其他char*

的示例
int sumofchar = 0;
for(char * t = str1; *t != '\0'; ++t)
{
         sumofchar++;
}

使用指针运算的示例

int placeInArr = -1; 

(不要使用那个,因为它相当混淆。

答案 2 :(得分:1)

如何使用std::string

轻松完成此操作
std::string str1 {"ppC"};

std::string str2 {str1.crbegin(),str1.crend()};

完成了。您应该总是更喜欢标准库而不是手写代码,它更不容易出错,更容易阅读并且可能更高效。

答案 3 :(得分:0)

我认为这段代码在第一个while循环中“停止”:

while(*str1 != '\0') // THIS LOOP ADD NUMBERS OF CHARACTERS IN ARRAY
{
         sumofchar++;
         str1++; 
}

您只是不能做指针算术str1++;-在这里,根据您将指针移动到的代码,它现在指向内存的某些(未知)部分,因此可能会有一些垃圾值,并且您可能会看到编译此代码时。 您的代码的有效解决方案可能如下所示(仅适用于我的版本):

#include <iostream>

int main()
{
    const char* str1 = "ppC";

    int sumofchar = std::strlen(str1);
    std::cout << sumofchar << std::endl; 

    char* strNew = new char[sumofchar];

    for (int i = 0; i < sumofchar; ++i)
    {
        strNew[i] = str1[sumofchar - i - 1];
    }

    for (int i = 0; i < sumofchar; ++i)
    {
        std::cout << strNew[i];
    }
}

我没有使用while循环,但是如果您只想:)