2016-05-25 2 views
0

リーテコードパズルを解決していて、私はこれをかなり早く解決しましたが、私は奇妙なエラーに遭遇しています。私の出力は期待される出力と一致しているので、私は次のテストケースに基づいて私のソリューションを拒否している理由がわかりません。C:リバース文字列関数の何が問題になっていますか?

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?" 

は、誰もが私の機能と間違っているかもしれないものを発見しますか?定義されていない動作はどこにありますか?

+1

'char型の温度に変更し' char型の温度[1] '[2]'、あなたはヌル文字のための追加のエントリが必要として。 –

+1

または 'strncat'を使用してください。 – Michael

+0

@barakmanosは変更を加えても、そのテストケースを破ります。コンパイルするために 'strncpy'の後に' temp [1] = '\ 0'; 'を追加しました。 – MrPickles

答えて

1

あなたはtempのための2つの文字を割り当て、0に初期化するため、また

char temp[2] = { 0 }; 

に変更し、最初のstrcatが正常に動作するように、それにメモリを割り当てた後reversed_stringを初期化する必要があります。

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

を意味しました。私は 'malloc'を実行した後に' reversed_string'を初期化していないので、@barakmanosごとに 'temp [2]'を追加しました。答えは今leetcodeで受け入れられます。 – MrPickles

1

投稿このコードの一部:

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

は正しいことをやっていません。

元の文字列の最後から逆の文字列の先頭に一度に1バイトずつコピーする必要があります。

  1. がきれい
  2. をコンパイルすることはありませんオンラインコーディングコンテストの1つで使用することとしているので、目的の機能
  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 
関連する問題