1

reverser()反转 cstring(不在位)。99% 的时间它都可以工作,但某些输入会破坏它,例如,如果为 aStr2[] 分配了一个由相同字符组成的字符串,则会出现错误。

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

char* reverser(const char *str);

int main()
{
    char aStr[] = "aaa";
    char aStr2[] = "cccccc";
    printf("%s %s", aStr, aStr2);
    char* tmp = reverser(aStr2);//tmp now has garbage
    printf("\n%s", tmp);
    printf(" %s", aStr2);
    return 0;
}


char* reverser(const char *str)
{
    char* revStr = (char*)malloc(strlen(str));
    int i;
    for(i = strlen(str)-1; i >= 0; i--)
{
        revStr[strlen(str)-1-i] = str[i];
}
    return revStr;
}

aaa cccccc
cccccc9 cccccc
Process returned 0 (0x0)   execution time : 0.068 s
Press any key to continue

注意不应该存在的 9。

4

3 回答 3

2

您的问题是您没有将字符串终止符放在反向字符串中。C 中的所有字符串实际上都是一个额外的字符,它没有被 报告strlen,这就是字符'\0'(或者简单明了,一个零)。这会告诉所有 C 函数字符串何时结束。

因此,您需要在malloc调用中为这个额外的终止符分配空间,并将其添加到字符串中的最后一个字符之后。

您的代码还有一些其他问题,首先是您不应该强制转换 return of malloc(或任何其他返回函数void *)。另一个你有内存泄漏的原因是你没有释放你分配的内存。最后一点在像你这里的小程序中无关紧要,但在更大和更长运行的程序中将是一个问题。

于 2013-10-04T10:40:33.460 回答
2

将此 malloc 更改为 strlen(str) + 1 ,加上 1 表示 '\0'

char* revStr = (char*)malloc(strlen(str) + 1);

在for循环之后

revStr[strlen(str)+1] = '\0';
于 2013-10-04T10:44:41.080 回答
0

您还没有以空值终止您的反转字符串。您需要将 revStr[] 的最终索引设置为 0。

于 2013-10-04T10:40:13.480 回答