2016-06-28 18 views
0

私は比較的新しいです。私はcoderbyte challengesを解決することによって少し言いたかったのです。単純な文字列逆アルゴリズムの予期せぬ結果

しかし、私は最初に立ち往生しています。それは単純なストリング逆アルゴリズムであると考えられている。

"asdf"や "1234567"のようなものを入力すると、出力は正しいです( "fdsa"、 "7654321")。しかし、 "12345678"または "thisiscool"と入力すると、結果として "87654321 @"/"loocsisiht @"が表示されます。私はどこから来ているのかわかりません。

これは私のコードです:私は、エラーを見つけることができる場所

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

void FirstReverse(char str[]) { 

    int len = strlen(str); 
    char nstr[len]; 
    int i; 

    for(i = 0; i < len; i++) { 
     nstr[i] = *(str+len-1-i); 
    } 

    printf("%s\n", nstr); 

} 
int main(void) { 

    char str[100]; 

    FirstReverse(gets(str)); 
    return 0; 

} 

誰かが私に教えていただけますか? ありがとうございます。

+3

'strlen'は、* nul終了なしの長さを返します。したがって、' nstr'は小さすぎます。また、ヌル終了を割り当てることもありません。 – user694733

答えて

0

他の回答にも触れましたが、ターミネーターがありません。 また、あなたのやり方と同じように文字列を割り当てるのは悪い習慣であることにも注意してください。このように作成する場合、配列は常に固定サイズでなければなりません。

あなたは代わりに実行する必要があります。

char * nstr = malloc(sizeof(char) * (len+1)); 

は、これにより、各文字(1バイト)倍な長さのサイズを割り当てます。 文字列ターミネータのスペースが必要なため、+1に注意してください。

printf(、string)を呼び出すと、それは最初の文字から始まり、すべてをターミネータまで印刷します。ここにターミネーターがないので、@のようなランダムな文字が出力されます。あなたがしたいが、それを修正するために行うつもりだ何

は、追加された:あなたのループの後

nstr[i] = '\0'; 

を。

割り当てられたメモリを解放することも忘れないでください。

0

nstr []で終端 '\ 0'の文字を割り当てるのを忘れてしまいました。

ので、より良い使用:char nstr[len + 1];とさらにnstr[len] = 0;

を設定:gets()は悪である:glibcのマニュアルページから:

)(取得は絶対に使用しないでください。データを事前に知ることなく、gets()が読み込む文字が何であるかを知ることができないため、gets()はバッファの末尾を越えて文字を格納し続けるため、使用することは非常に危険です。これは、コンピュータのセキュリティを破るために使用されています。代わりにfgets()を使用してください。

1

Cでは、文字列はゼロで終了します。たとえば、 "cat"という文字列は4文字で、( 'c'、 'a'、 't'、(char)0)で表されます。あなたはstrlenが最終0せずに文字列の長さを返すので、文字列foostrlen(foo)+1文字が含まれていることを最終的に0

注意を忘れてしまいました。文字列を割り当てるときにこれを覚えておいてください。

関連する問題