我想从一个数组中反转字符并将它们复制到新数组,但它不起作用。这是我在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.
首先是这段代码
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;
}
你将原始指针增加到你的字符串,因此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;
(不要使用那个,因为它相当混淆。
如何使用std::string
轻松完成此操作:
std::string str1 {"ppC"};
std::string str2 {str1.crbegin(),str1.crend()};
并做了。您应该总是更喜欢标准库而不是手写代码,它更不容易出错,更容易阅读并且可能更高效。
我认为这个代码在第一次循环时“停止”:
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循环但你可以这样做,如果你只是想:)