在C语言中编写字符串反转程序

5
我已经写了一个程序来翻转字符串。但是它没有起作用。它输出的是与输入相同的字符串。代码有什么问题呢?
#include <stdio.h>
#include <stdlib.h>
char *strrev(char *s)
{
        char *temp = s;
        char *result = s;
        char t;
        int l = 0, i;
        while (*temp) {
                l++;
                temp++;
        }
        temp--;
        for (i = 0; i < l; i++) {
                t = *temp;
                *temp = *s;
                *s = t;
                s++;
                temp--;
        }
        return result;
}

int main()
{
        char *str;
        str = malloc(50);
        printf("Enter a string: ");
        scanf("%s", str);
        printf("%s\n\n", strrev(str));
        return 0;
}

@chris:这可能是一项家庭作业任务。while (*temp) 是什么意思?这合法吗? - Robert Harvey
@RobertHarvey,我知道,只是想指出一下。无论如何,它会一直执行,直到该位置的字符为空(字符串结尾)。 - chris
@RobertHarvey:如果这是一份C++的作业(标签已经被移除),那么std::reverse将是唯一正确的答案。 - Jan Hudec
3
如果这是一个决定 OP 是否能够编写简单算法的任务,而不是一个“是否有 stdlib 方法可以做到这一点”的问题,那么它就不会。 - user529758
2
@RobertHarvey 为什么要评论你不熟悉的编程语言?是的,当然它是合法的,对于任何C程序员来说,它的意义是清晰明了的。 - Jim Balter
1
@JimBalter:为什么我不能问一些我不懂的问题呢?这不是我们在这里的原因吗? - Robert Harvey
8个回答

15
for (i = 0; i < l; i++)

你正在遍历整个字符串,因此你反转了它 两次 —— 它最终不会被反转。只需遍历一半即可:
for (i = 0; i < l / 2; i++)

如果允许的话,也可以尝试使用 int len = strlen() 替代 while-not-end-of-string 循环。


4
你需要交换字符串的内容两次。

2
请使用以下代码...
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

char *strrev(char *s)
{
     char *temp = s;
     char *result = s;
     char t;
     while (*temp)
          temp++;

     while (--temp != s)
     {
            t = *temp;
            *temp = *s;
            *s++ = t;
     }
     return result;
 }

 int main()
 {
      char *str;
      str = (char*)malloc(50);
      printf("Enter a string: ");
      scanf("%s", str);
      printf("%s\n\n", strrev(str));
      return 0;
  }

这个没问题。谢谢你的关注。:) - Raghu Srikanth Reddy

1
you can use this code to reverse the string
#include<stdio.h>
#include<string.h>
int main()
{
    int n,i;
    char str2[100],str1[100];
    printf("enter teh string 1\n");
    gets(str1);
    n = strlen(str1);
    for(i=0;i<n;i++)
    {
    str2[n-1-i]=str1[i];
    }
    printf("%s\n",str2);

}

1

您可以使用这个简单的代码

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>


int str_len (char *str)
{
   char *ptr = str;
    while (*str)
     str++;
   return str - ptr;
}

int main ()
{
  char *str;
  int length;
  str = (char*)malloc(50);
  printf("Enter a string: ");
  scanf("%s", str);
  length = str_len(str) - 1;

  for (int i = length ; i >= 0 ; i--)
  printf ("%c", str[i]);
  return 0;
}

这段代码并不是很受欢迎,因为它只是按相反的顺序打印字符串,而不是真正地翻转字符串。翻转字符串才是预期的操作。 :) - Raghu Srikanth Reddy

1
逻辑是交换从开头到第一半的字符和第二半的最后一个字符,即到len/2。只需将您的for循环修改如下,它就可以正常工作: for (i = 0; i < l/2; i++) {

1
你可以使用同一个程序来检查回文。定义一个 int flag = 0,然后在 for 循环中,如果 (*s != *temp),则 flag = 1;然后在循环外部,如果 (flag == 0),那么就是回文..!! - Xavier DSouza

0

交换字符串内容两次...

交换一次会有帮助...

for (i = 0; i < l/2; i++)

0
其实你把字符串反转了两次...所以当到达字符串中间时,你应该终止循环,也就是你的循环应该运行字符串长度的一半即 l/2(在这个例子中)。所以你的循环应该像这样。
for(i = 0; i < i / 2; i++)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接