簡體   English   中英

C:我的反向字符串函數怎么了?

[英]C: What's wrong with my reverse string function?

在解決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?"

有人發現我的功能可能有問題嗎? 哪里有未定義的行為?

您需要為temp分配2個字符並用0初始化,因此將其更改為

char temp[2] = { 0 };

另外,在為其分配內存之后,初始化reversed_string ,以便第一個strcat正常工作。

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

這部分已發布的代碼:

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

沒有做正確的事。

從原始字符串的末尾到反向字符串的開頭,它應該一次復制一個字節。

建議以下代碼:

  1. 干凈地編譯
  2. 執行所需的功能
  3. 是完整的程序
  4. 因為它將在一種在線編碼競賽中使用,所以不會執行任何錯誤檢查。

現在,代碼

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM