在 C++ 中反转字符串

Posted

技术标签:

【中文标题】在 C++ 中反转字符串【英文标题】:Reversing string in C++ 【发布时间】:2017-01-09 01:38:42 【问题描述】:

在以下部分字符串交换代码

 end = &str[len - 1];

我不理解寻址部分。当我在没有寻址部分的情况下执行此操作时,它仍会运行,但会警告我“无法将 char 类型的值分配给 char 类型的标识”。完整代码如下:

    #include<iostream>
    #include<cstring>
    using namespace std;

int main()

    char str[] = "This is a test";
    char *start, *end; 
    int len;
    int t; 

    cout << "Original " << str << "\n";
    len = strlen(str);
    start = str;
    end = str[len - 1];  

//this reverses the string
    while (start < end)  

        t = *start;  
        *start = *end; 
        *end = t; 

        start++; 
        end--; 

    
    cout << "Reversed" << str << "\n";
    system("PAUSE");
    return 0;

【问题讨论】:

"在 C++" 中反转字符串,请不要这样。不是这样的。我尊重 C 和 C 程序员,他们的东西,应该给他们。你有一个专用的字符串类型,你有算法,你有swap...c++ 不仅仅是cout。对不起,抱怨,但我感到有点难过。 我正在通过教科书做例子。 我会标记它。严重地。我会认为它有害。它教你过时的东西。在适当的 c++ 程序中,您永远不会遇到这样的问题......或者它是一本 C 书?这看起来像带有 cout 的 C 代码。这就是 15-20 年前 C 程序员用来教授 c++ 的方式。至少这是我的经验。 我正在使用 Herbert Schildt 编写的 C++ 初学者指南第二版。有没有更好的书推荐给像我这样的初学者? 我确实有一个后续问题。为什么下面不需要指向地址:start = str; 【参考方案1】:

我不理解寻址部分。

给定

char str[] = "This is a test";
char *start, *end; 
len = strlen(str);

那么end是指向char的指针,并且

end = &str[len - 1]; // `end` points to the last character (before the `\0`)

您必须使用&amp;(地址)运算符,因为end 是指针,因此必须将其分配给某物的地址(此处为字符串最后一个字符的地址)。

当我没有寻址部分时它仍然运行

我不认为它会 - 你应该有一个编译错误

end = str[len - 1]; // invalid conversion from ‘char’ to ‘char*’

【讨论】:

我确实有一个后续问题。为什么下面不需要指向地址:start = str; @Jeff - 那是因为 str 是一个字符串(不是单个字符)【参考方案2】:

你应该知道end的类型是char*,但是str[len-1]的类型是char,所以你需要把str[n-1]的类型改成char*,所以你需要&amp;str[len-1]

但是如果你使用string,会有一个简单的方法:

使用STL中的std::reverse方法:

std::reverse(str.begin(), str.end()); //str应该是字符串类型

您必须包含“算法”库#include。

【讨论】:

您的帖子没有解决 OP 的问题。 @RSahu OP 实际上并没有问问题。一个合理的猜测是,问题是“在 C++ 中反转字符串的明智方法是什么”。 @DavidSchwartz,他们确实做到了:我不理解寻址部分 我理解他们在尝试解决实际问题时遇到的困难——如何反转字符串。如果这是问题的话,正确的答案是不要以如此可怕的方式去做。但这突显了为什么在按下 按钮后,对某人来说真正 question 非常重要。 我很欣赏这两个答案。我明白为什么你仍然需要它,现在明白有更好的方法来完成它。下次我会更具体,但问题已得到解答。谢谢!!!【参考方案3】:

也许这会有所帮助

void reverse (char word[])

   int left = 0;
   int right = strlen(word) - 1;

   while (left < right)
   
      char temp = word[left];
      word[left] = word[right];
      word[right] = temp;
      left++;
      right--;
   
   cout << word;


我希望这能给你这个想法。

【讨论】:

以上是关于在 C++ 中反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用指针在 C++ 中反转字符串

如何在 C++ 中反转字符数组? [关闭]

如何使用交换函数和指针反转字符串数组? (C++)

反转字符串C++ [关闭]

C++:使用递归反转字符串

c++简单入门训练