C中的字符串反转不起作用

时间:2016-02-13 16:17:07

标签: c string

我尝试使用c反转字符串,但以下代码段不起作用且输出未按预期打印,

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

void reverse(const char * orig);

int main(void)
{
    char * string = "REVERSE";
    reverse(string);
    return 0;
}

void reverse(const char * orig)
{
    int i = 0, j=strlen(orig);
    int k = j;
    printf("The string is : %s \n",orig);
    char * new =  (char *)malloc((j*sizeof(char))+1);
    while(j > 0)
    {
        new[i++] = orig[j--];
    }
    new[k+1] = '\0';

    printf("\n The Reversed string is : %s",new);
}

4 个答案:

答案 0 :(得分:2)

在第一个循环while (j > 0)中,jstrlen(orig),因此orig[j--]是终止'\0'的字符串。

new[i++] = orig[j--];其中i == 0new的第一个字符表示字符串的结尾,因此结果字符串始终为空。

您可能希望将其更改为new[i++] = orig[--j];

您还需要将new[k+1] = '\0';更改为new[k] = '\0';以正确终止输出字符串new

答案 1 :(得分:1)

算法错误

  • j应从strlen(orig)-1开始,否则您将在new的第一个位置复制字符串终止符,从而使其成为零长度字符串;
  • 循环条件应为j>=0 - 您确实要复制目标字符串的第一个字符;
  • 您必须使用NUL字符手动终止new;

语言使用错误

  • 你是malloc但不是free - 因此你的reverse功能正在泄漏记忆;
  • 不推荐将字符串字面值转换为非const char *(在main中);

文体警告

    根据定义,
  • sizeof(char)为1,因此将其包含在计算中是没用的;
  • 虽然C中的有效变量名称,new是C ++中的保留关键字,因此您可能希望使用不同的名称(通常C代码最终混合在C ++代码中和/或编辑器使用相同的荧光笔定义因此令人困惑的事情)。

答案 2 :(得分:0)

问题

是在第一次迭代时orig[j=strlen(orig)]`是字符串终止符。您将终止符放在新字符串的开头。

更改为

new[i++] = orig[--j];

live

答案 3 :(得分:0)

上面提供了用于手动编码字符串反向的答案。

但是如果你想在string.h库中使用内置函数,你可以使用: strrev(string)