用C反转句子?

时间:2009-07-03 18:44:59

标签: c string

我刚刚编写了一个程序,无论用户提供什么,都会反转一个句子。例如:如果用户输入“你好吗”,我的程序会生成“uoy era woH”。

我写的程序如下所示。我只是有一个疯狂的直觉,可以有一个比这更聪明的程序。非常感谢您提供的宝贵意见,或者也欢迎任何更好的计划。

int ReverseString(char *);
main() {
  char *Str;
  printf("enter any string\n");
  gets(Str);
  ReverseString(Str);
  getch();
}
int ReverseString(char *rev) {
  int len = 0;
  char p;
  while(*rev!='\0') {
    len++;
    rev++;
  }
  rev--;
  while(len>0) {
    p = *rev;
    putchar(p);
    rev--;
    len--;
  }
}

非常感谢。

9 个答案:

答案 0 :(得分:7)

你可以使用递归。

int ReverseString(char *rev) {
  if(*rev!='\0') {
    ReverseString(rev + 1);
    putchar(*rev);
  }
  return 1;
}

答案 1 :(得分:3)

void ReverseString( char* str, int len ) {
  if( len > 1 ) {
    swap( &str[0], &str[len - 1] );
    ReverseString( ++str, len - 2 );
  }
}

或者,展开尾递归:

void ReverseString( char* str, int len ) {
  while( len > 1 ) {
    swap( &str[0], &str[len - 1] );
    ++str;
    len -= 2;
  }
}

其中swap定义为:

void swap( char* a, char* b ) {
  *a ^= *b;
  *b ^= *a;
  *a ^= *b;
}

如果你使用这个,你的TA肯定会知道你自己没有想到这一点:)

答案 2 :(得分:0)

这不起作用。应该为你的句子分配记忆。

char *Str;
printf("enter any string\n");
gets(Str);

应该是:

char str[81]={0};
printf("Enter any string up to 80 characters\n");
scanf("%80s\n",str);
ReverseString(str)

此外,你应该避免获取功能。它会导致buffer overflows

答案 3 :(得分:0)

好的,这是我的功能。我刚才写的,只是为了练习。

char* reverse(char *string){

    int length = 0;
    int half = 0;

    length = strlen(string);
    half = (length/2) - 1;
    --length;

    int i = 0;
    register char interim;
    for(; i<=half; ++i){
        interim = string[i];
        string[i] = string[length - i];
        string[length - i] = interim;
    }

    return string;

}

现在我看着它,我为它感到骄傲,而不是在我开始工作的时候。我只是张贴它,因为当我找到它时,我要求我发布它 - 并且为了完整性。

在查看其他一些答案之后,我意识到计算一半字符串是不必要的,我可以简化length,直到ilength相等。哦,好吧 - 在这里。

此外,请不要抨击我使用register关键字:P

答案 4 :(得分:0)

如果您不知道字符串的长度:

void reverse_string(char* str) {
  char* p2 = str;
  while (*p2 != '\0') {
    /* assumes the string is null-terminated, will fail otherwise */
    ++p2;
  }
  --p2;
  char* p1 = str;
  while (p1 < p2) {
    char tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
    ++p1;
    --p2;
  }
}

如果你这样做:

void reverse_string(char* str, const size_t len) {
  if (len <= 1) {
    return;
  }
  char* p2 = str + len - 1;
  char* p1 = str;
  while (p1 < p2) {
    char tmp = *p1;
    *p1 = *p2;
    *p2 = tmp;
    ++p1;
    --p2;
  } 
}

答案 5 :(得分:0)

以下程序以反向字符顺序打印其参数:

#include <string.h>
#include <stdio.h>

char * reverse(char * string) {
  char * a = string;
  char * b = string + strlen(string) - 1;
  for(; a < b; ++a, --b)
    *a ^= *b, *b ^= *a, *a ^= *b; // swap *a <-> *b
  return string;
}

int main(int argc, char * argv[]) {
  for(int i = 1; i < argc; ++i)
    puts(reverse(argv[i]));
}

此处没有新内容,但IMO比大多数其他答案更具可读性。

答案 6 :(得分:0)

void revstr(TCHAR *str) {
  if( *str == '\0' ) {
    return;
  }
  TCHAR *start = str;
  TCHAR *end = start + strlen(str) - 1;
  while(start < end) {
    *start ^= *end;
    *end ^= *start;
    *start ^= *end;
    *start++;
    *end-–;
    /*
      could also use *start ^= *end ^= *start++ ^= *end–-; if you want to get fancy
    */
  }
}

2005 version of myself被盗,但是那个家伙,他和我的妻子睡了。是的,我知道我不需要一些'*',但我先写了一个单行,然后转换它,而单行则需要它们。

答案 7 :(得分:0)

另一种变化......

void ReverseString( char *str, int len ) {
  int i;
  for(i=0; i < len/2; i++) {
    swap( &str[i], &str[len -1 -i] );
  }
}
void swap( char *a, char *b ) {
  char tmp = *a;
  *a = *b;
  *b = tmp;
}

答案 8 :(得分:-1)

#include<stdio.h>
void reverse(char s[])
{
        int i=0,j,x=0,z;
        printf("\nThe string is : ");
        printf("%s",s);
        printf("\nThe reverse string is : ");
        while(s[i] != ' ')
        {
                while(s[i] != ' ')
                        i++;
                z=i+1;
                for(j=i-1;j>=x;j--)
                        printf("%c",s[j]);
                printf(" ");
                i=z;
                x=z;
        }
}
main()
{
char s[50];
int a;
for(a=0;a<50;a++)
        s[a]=' ';
puts("\nEnter a sentence : ");
fgets(s,50,stdin);
reverse(s);
}