使用字符数组反转字符串

Posted

技术标签:

【中文标题】使用字符数组反转字符串【英文标题】:Reversing string using character array 【发布时间】:2016-03-04 19:12:43 【问题描述】:

我写了一个程序来反转字符串,其中字符串是一个字符数组。程序是:

#include<iostream>
void rev(char *str)

  char *end;
  end = str;// end will now point to the same address of str
  // now we need to incremet the end pointer upto it encounter null
  if(str)// this checks if the string is present or not
  
    while(*end)
      ++end;
    --end;// set one character back, since last character is null
    // swap characters from start of string with the end of the string
    // until the pointers meet in middle.
    while(str < end)
    
      char temp = *str;
      *str++ = *end;
      *end-- = temp;
    
  
  std::cout<<"\n The reversed string is : \n";
  std::cout<<str<<std::endl;

int main()

  char str[500];
  std::cout<<"\n Enter the string : ";
  std::cin.getline(str, sizeof(str));
  rev(str);
  return 0;

一个输出实例是:

Enter the string : asdfgh

 The reversed string is : 
dsa

我想就地解决这个问题并使用字符数组。

互联网上有许多可用的解决方案。我见过他们。但我想知道这个实现哪里出了问题。如果 str 中有一些额外的增量。我想知道如何纠正它。

【问题讨论】:

这对于一个简单的 5 行程序来说非常令人困惑。 好吧,你不断增加str指针,在rev()的末尾它指向数组的中间... 尝试一些关注点分离。名为rev 的函数应该反转。不跳舞,不弹吉他,不给你送咖啡和羊角面包,不打印任何东西。反向。 Reverse String C++ using char array的可能重复 我们程序员的注意力范围缩小了,这就是为什么我们更喜欢做一件事的短函数。没有那么多事情要跟踪==好东西。如果你坚持在同一个函数中做两件事,你就必须跟踪这些东西。例如,当您打印str 时,您确定它是整个字符串吗?您是否记录了您使用str 的目的? 【参考方案1】:

我认为你把问题弄得太混乱了。

void reverse(char* s) 
  // return if s is nullptr
  if(!s) return;

  size_t len = strlen(s);

  // swap ith from front with ith from back
  for(size_t i = 0; i < len/2; ++i) 
    char temp = s[i];
    s[i] = s[len - i - 1];
    s[len - i - 1] = temp;
  

【讨论】:

对不起,这不是一个有用的答案。互联网上到处都是这样的答案。 @Ayushibhardwaj 你没有问对问题。 :) 不错。我想你可以使用std::swap,但是,不是吗? OP 不是要求复制别人的解决方案,问题是 OP 的代码哪里出错了。 好的,我可以看到。但我认为这暗示他们在问为什么他们的代码不起作用。不过,修订版清除了这一点。【参考方案2】:

嗯,错误是你不断增加str 指针,然后减少end 指针,最终在字符串中间的某个地方相遇。之后,您以相反的顺序打印出从中间某处开始的字符串。所以,我建议这样做:

#include<iostream>
void rev(char *str) 
  char *end;
  end = str;

  if(str) 
    while(*end)
        ++end;
    --end;

    while(str < end) 
      char temp = *str;
      *str++ = *end;
      *end-- = temp;
    
  
  /* Don't print the string here itself */


int main() 
  char str[500];
  std::cout<<"\n Enter the string : ";
  std::cin.getline(str, sizeof(str));
  rev(str);

  /* Print your string here */
  std::cout<<"\n The reversed string is : \n";
  std::cout<<str<<std::endl;
  return 0;

输出:

 Enter the string : qwertyuiop

 The reversed string is : 
poiuytrewq

【讨论】:

@erip 不,此代码有效,因为通过将打印移到函数外部,它打印出用于反转字符串的指针的副本。跨度> 这似乎是对实际问题的唯一正确答案。【参考方案3】:

好吧,既然这是标记为 c++,你应该注意你可以这样做

void rev(char* str)

    std::reverse(str, str + strlen(str));

查看documentation for std::reverse,您可以推断它是在原地完成的。

【讨论】:

【参考方案4】:

试试这个:

#include<bits/stdc++.h>

int main()

    char str[500], revstr[500];
    int i,j,len;
    std::cout<<"\n Enter the string : ";
    std::cin.getline(str, sizeof(str));

    //reverse str
    len = strlen(str);
    for(i=len-1, j=0; i>=0; i--, j++)
        revstr[j]=len[i];
    
    revstr[j] = '\0'; //marks end of string

    std::cout<<"\n The reversed string is : \n";
    std::cout<<revstr<<std::endl;

  return 0;

【讨论】:

对不起,我没有要求这个。 此解决方案不满足就地要求。

以上是关于使用字符数组反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

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

实现字符串(或数组)反转并制定反转范围的两种方式

js字符串反转(倒序)的多种处理方式

LC 反转字符串

字符串反转方法汇总

LeetCode 344. 反转字符串