我做错了什么? 反向字符串 C++

Yar*_*ani 0 c++ string reverse for-loop c-strings

所以我想在 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 ;
Run Code Online (Sandbox Code Playgroud)

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

J. *_*Doe 7

我究竟做错了什么?

您正在使用charC 标准库的数组和函数来操作 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";
}
Run Code Online (Sandbox Code Playgroud)

如果——出于某种超出我理解的原因——你*必须*步行,以惯用的方式完成并提供一个带有一对迭代器的接口:

#include <algorithm>

void str_reverse(char *begin, char *end)
{
    while (begin < end)
        std::swap(*begin++, *--end);
}

// ...

#include <cstring>
// ...
char foo[]{ "Hello, World!" };
str_reverse(foo, foo + std::strlen(foo));
Run Code Online (Sandbox Code Playgroud)

如果您<algorithm>因任何原因不能使用实现您自己的swap()

template<typename T>
void swap(T &a, T &b)
{
    T tmp{ a };
    a = b;
    b = tmp;
}
Run Code Online (Sandbox Code Playgroud)

  • 更简单:`std::string bar{ foo.rbegin(), foo.rend() };`。 (5认同)
  • @J。Doe“你正在使用C的char数组和函数”这没有错。他正在学习如何处理包含字符串的字符数组。它是每个人都应该知道的语言的重要组成部分。 (2认同)

Vla*_*cow 5

在这个循环中

for (int i = 0 ;  i <= strlen(a); i++){
       reverse[i]= a[strlen(a)-i];
Run Code Online (Sandbox Code Playgroud)

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

例如,当i等于 0 时,您将字符串中的终止零字符处理到字符串a的第一个位置reverse

reverse[0]= a[strlen(a)-0];
Run Code Online (Sandbox Code Playgroud)

代码可以写得更简单,而不需要例如对函数的冗余调用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';
Run Code Online (Sandbox Code Playgroud)

请注意,有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;
}
Run Code Online (Sandbox Code Playgroud)

程序输出是

dlrow olleh
hello world
Run Code Online (Sandbox Code Playgroud)