C:我的反向字符串函数出了什么问题?

时间:2016-05-25 07:08:15

标签: c reverse

一直在解决leetcode难题,并认为我很快解决了这个问题,但我遇到了一个奇怪的错误。我的输出与预期输出相匹配,所以我不知道为什么它会根据以下测试用例拒绝我的解决方案。

char* reverseString(char* s) 
{
/* Sample input: "Hello"
   Sample output: "olleh"
*/

    char * reversed_string;
    char temp[1];
    int length = 0;
    int i;

    if(s == NULL)
        return NULL;

    length = strlen(s);

/* While string is not null, increment pointer */
    while(*s != NULL)
    {
        s = s + 1;
    }

/* Allocate reversed string based off length of original string */
reversed_string = malloc(length + 1);

/* Traverse backwards for length of string */
/* Copy each letter to temp */
/* Concatenate each letter to reversed_string */
    for(i = 0; i < length; i++)
    {
        s = s - 1;
        strncpy(temp, s, 1);
        strcat(reversed_string, temp);
    }

    reversed_string[length] = '\0';

/* Return reversed string */
    return reversed_string;
}

MOutput =我的输出

EOutput =预期输出

Input:   "?CZU.9Iw8G3K?fse,b7 m;0?f :`c9d!D'`Pem0'Du0;9i` 03F,: 7,oPw'T'5`1g!iwR5J71iJ\"f;r6L;qZaDGx?cvkS 8\"UY2u`YC P3CM y`4v 1q7P;Zd1.;:RA!oYh;!2W8xMfMx8W2!;hYo!AR:;.1dZ;P7q1 v4`y MC3P CY`u2YU\"8 Skvc?xGDaZq;L6r;f\"Ji17J5Rwi!g1`5'T'wPo,7 :,F30 `i9;0uD'0meP`'D!d9c`: f?0;Z 7b,esf?K3G8wI9.UmC?"

MOutput: "?CmU.9Iw8G3K?fse,b7 Z;0?f :`c9d!D'`Pem0'Du0;9i` 03F,: 7,oPw'T'5`1g!iwR5J71iJ"f;r6L;qZaDGx?cvkS 8"UY2u`YC P3CM y`4v 1q7P;Zd1.;:RA!oYh;!2W8xMfMx8W2!;hYo!AR:;.1dZ;P7q1 v4`y MC3P CY`u2YU"8 Skvc?xGDaZq;L6r;f"Ji17J5Rwi!g1`5'T'wPo,7 :,F30 `i9;0uD'0meP`'D!d9c`: f?0;m 7b,esf?K3G8wI9.UZC?"

EOutput: "?CmU.9Iw8G3K?fse,b7 Z;0?f :`c9d!D'`Pem0'Du0;9i` 03F,: 7,oPw'T'5`1g!iwR5J71iJ"f;r6L;qZaDGx?cvkS 8"UY2u`YC P3CM y`4v 1q7P;Zd1.;:RA!oYh;!2W8xMfMx8W2!;hYo!AR:;.1dZ;P7q1 v4`y MC3P CY`u2YU"8 Skvc?xGDaZq;L6r;f"Ji17J5Rwi!g1`5'T'wPo,7 :,F30 `i9;0uD'0meP`'D!d9c`: f?0;m 7b,esf?K3G8wI9.UZC?"

有人发现我的功能可能有什么问题吗?在任何地方都有未定义的行为吗?

2 个答案:

答案 0 :(得分:1)

您需要为temp分配2个字符并使用0&#39;进行初始化,因此请将其更改为

char temp[2] = { 0 };

此外,在为其分配内存后初始化reversed_string,以便第一个strcat正常工作。

reversed_string = malloc(length + 1);
reversed_string[0] = '\0';

答案 1 :(得分:1)

这部分发布的代码:

for(i = 0; i < length; i++)
{
    s = s - 1;
    strncpy(temp, s, 1);
    strcat(reversed_string, temp);
}

做得不对。

它应该一次复制一个字节,从原始字符串的末尾到反向字符串的开头。

建议以下代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 是一个完整的程序
  4. 因为它将在其中一个在线编码竞赛中使用,不会执行任何错误检查。
  5. 现在,代码

    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    // use meaningful variable and parameter names
    char* reverseString(char* original)
    {
        size_t length = strlen( original );
    
    
        /* Allocate reversed string based off length of original string */
        char *reversed = NULL;
        reversed = malloc(length + 1);
    
        char *dest = reversed;
        char *source = &(original[ strlen(original) -1 ]);
    
        for( ; source >= original; source--)
        {
            *dest = *source;
            dest++;
        }
    
        *dest = '\0';
    
        /* Return reversed string */
        return reversed;
    } // end function: reverseString
    
    
    int main( void )
    {
        char inBuffer[ 4096 ];
        fgets( inBuffer, sizeof(inBuffer), stdin );
    
        // eliminate trailing newline if it exists
        char * newline = NULL;
        if( NULL != (newline = strstr( inBuffer, "\n" ) ) )
        {
            *newline = '\0';
        }
    
        char * newString = reverseString( inBuffer );
        printf( "%s\n\n", newString );
    } // end function: main