我在做什么错?反向字符串c ++

问题描述 投票:1回答:3

所以我想在c ++中做最简单的事情,反转一个字符串(存储新字符串),然后打印它

我的代码是:

char a[size] , reverse[size];
strcpy(a,"dlow olleh " );
for (int i = 0 ;  i <= strlen(a); i++) {
   reverse[i]= a[strlen(a)-i];
}
cout << reverse ;

我必须注意cout << reverse [i];在for循环内一切都很好,但是当我想将它打印为字符串时,我不能理解我错过了什么。cout << reverse [i];

c++ string for-loop reverse c-strings
3个回答
3
投票

在此循环中

for (int i = 0 ;  i <= strlen(a); i++){
       reverse[i]= a[strlen(a)-i];

您正在访问的字符超出了字符串的实际字符。

例如,当i等于0时,您要将字符串a的终止零字符压缩到字符串reverse的第一位置。

reverse[0]= a[strlen(a)-0];

无需例如冗余调用功能strlen,就可以简化代码编写。

char a[size], reverse[size];
strcpy( a, "dlrow olleh" );

size_t i = 0;
for ( size_t n = strlen( a ); i < n; i++ ) 
{
    reverse[i] = a[n - i - 1];
}
reverse[i] = '\0';

std::cout << reverse << '\n';

请注意,存在执行相同任务的标准算法std::reverse_copy

下面有一个演示程序。

#include <iostream>
#include <algorithm>
#include <cstring>

int main() 
{
    const size_t SIZE = 20;
    char a[SIZE], reverse[SIZE];

    std::strcpy( a, "dlrow olleh" );    

    std::cout << a <<'\n';

    auto it = std::reverse_copy( a, a + strlen( a ), reverse );
    *it = '\0';

    std::cout << reverse <<'\n';

    return 0;
}

程序输出为

dlrow olleh
hello world

4
投票

我在做什么错?

您正在使用char的数组和C标准库的函数来在C ++中操作字符串。

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::string foo{ "Hello, World!" };
    std::string bar{ foo };
    std::reverse(bar.begin(), bar.end());
    std::cout << '\"' << foo << "\" ==> \"" << bar << "\"\n";
}

0
投票

反转字符串时复制的第一个实际上是空终止符,因此当您将其打印到控制台时,它不会显示,因为空终止符是数组中的第一个终止符,所以您想这样做。

int size = 12;
char a[12], reverse[12];
strcpy(a, "dlow olleh ");
for (int i = 0; i < strlen(a); i++) {
    reverse[i] = a[strlen(a) - (i+1)];
}
reverse[11] = '\0';
cout << reverse;
© www.soinside.com 2019 - 2024. All rights reserved.