使用字符数组反转字符串

时间:2016-03-04 19:12:44

标签: c++ arrays string pointers

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

#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中有一些额外的增量。我想知道如何纠正它。

4 个答案:

答案 0 :(得分:5)

我认为你让问题太混乱了。

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;
  }
}

答案 1 :(得分:4)

好吧,错误是你继续增加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

答案 2 :(得分:3)

好吧,因为这是标记的c ++,你应该注意到你可以这样做

void rev(char* str)
{
    std::reverse(str, str + strlen(str));
}

查看documentation for std::reverse,您可以推断出它已经到位。

答案 3 :(得分:0)

试试这个:

#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;
}