我想从一个数组中反转字符并将它们复制到新数组中,但它不起作用。这是我在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.
答案 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循环,但是如果您只想:)