需要帮助查找bug,如果字符串输入组成所有相同的字符,则一个输出字符已损坏

时间:2013-10-04 10:37:14

标签: c arrays string memory-management cstring

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。

3 个答案:

答案 0 :(得分:2)

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

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

您的代码还存在其他一些问题,首先是您不应该转换malloc(或任何其他返回void *的函数)。另一个是你有内存泄漏,你没有释放你分配的内存。最后一点在像你这里的小程序中并不重要,但在较大和较长时间运行的程序中会出现问题。

答案 1 :(得分:2)

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

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

和for循环之后

revStr[strlen(str)+1] = '\0';

答案 2 :(得分:0)

你没有以空的方式终止你的反向字符串。您需要将revStr []的最终索引设置为0。