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

问题描述 投票:0回答:4

我想从一个数组中反转字符并将它们复制到新数组,但它不起作用。这是我在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.
c++ arrays reverse
4个回答
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
投票

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

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

Example using strlen

int sumofchar = std::strlen(str1);

Example using an additional char*

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

Example using pointer arithmetic

int placeInArr = -1; 

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


1
投票

如何使用std::string轻松完成此操作:

std::string str1 {"ppC"};

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

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


0
投票

我认为这个代码在第一次循环时“停止”:

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

你只是不能做指针aritmatics 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循环但你可以这样做,如果你只是想:)

© www.soinside.com 2019 - 2024. All rights reserved.