如何使用C反转字符串?

时间:2012-07-19 01:51:15

标签: c string pointers reverse

我想在C语言中反转一个字符串。我有点新意,所以我很乐意得到一些帮助和解释。为什么我的解决方案不起作用?

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

char *rev(char *str) {
  char *q = str;
  int len = strlen(str);
  char *p = (char*)calloc(len+1, sizeof(char));
  int j=0;
  if (NULL == str || len == 1) return str;
  for (j = len+1 ; j > 0 ; j-- ) {
    p[j]=*q;
    q++;
  }
  return p;
}

int main(int argc, char **argv){
  char *t = argv[1];
  char *p ;
  printf("%s",t);
  p=rev(t);
  printf("%s",p);
  getchar();
  return 0;
}

它无效:(

3 个答案:

答案 0 :(得分:3)

首先,您很聪明地使用calloc来确保结果缓冲区最后为零。

但它也把零点放在了开头!

您的循环终止条件为j > 0,这意味着您从未在结果中填充插槽0。

因此,当您尝试打印p时,它指向的缓冲区中的第一个字符包含\0 - 标记字符串的结尾,因此您的结果始终为空串

我在http://codepad.org/QppfYQkm处做了一些“修复”(我没有更改格式,我对参数进行了硬编码,因此它将是自包含的。)

除此之外:我删除了if (len == 1) return str的支票。不要这样做!如果你有一个单字符的字符串,你将返回与持有你的参数的缓冲区相同的缓冲区,这意味着对该结果的更改会破坏你的输入。将这些缓冲区分开。

你真的很亲密。 :)

<强>附录

以下是使用命令行参数的一些代码:

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

char *rev(char *str) {
  char *q = str;
  int len = strlen(str);
  char *p = (char*)calloc(len + 1, sizeof(char));
  int j;

  if (NULL == str) return NULL;

  for (j = len-1 ; j >= 0 ; j--) {
    p[j] = *q;
    q++;
  }
  return p;
}

int main(int argc, char **argv) {
  if (argc > 1) {
    char *t = argv[1];
    char *p ;

    printf("%s\n",t);
    p = rev(t);
    printf("%s\n",p);

    return 0;
  }
}

当我运行它时:

$ gcc rev.c && ./a.out "hello there, reverse me"
hello there, reverse me
em esrever ,ereht olleh
$ gcc rev.c && ./a.out ""


$ gcc rev.c && ./a.out
$

该程序可以正常使用文本和空字符串。没有任何争论时,它默默无闻。

答案 1 :(得分:2)

你必须小心你的边界指数。

一种解决方法是将for行替换为:

for (j = len-1; j >= 0 ; j-- )

答案 2 :(得分:0)

你需要遍历列表的一半(向下舍入,如果它是一个奇数长的字符串,则中间字符不能被反转),然后通过临时变量交换它。

您正在写一半以上的字符串,因为您没有使用临时变量。尝试类似:

for( j = 0; j < len / 2; ++j ) {
    char tmp = p[ j ];
    p[ j ] = p[ len - j - 1 ];
    p[ len - j - 1 ] = tmp;
}

编辑:这是有效的;如果你在另一个缓冲区中进行操作,则需要添加p [len] = 0;