2017-09-28 8 views
0

私はC言語を練習しており、単語のアルファベットのシーケンスを反転させる単純なプログラムを構築しました。 シーケンス反転プログラムでこのセグメンテーションエラーを修正するにはどうすればよいですか?

#include <stdio.h> 

int main(void) 
{ 
    char str[50]; 

    printf("Enter a word: "); 
    scanf("%s", str); 

    int i, len=0; 
    char temp; 

    while(str[len]!='\0') 
    { 
    len++; 
    } 
    /* 
    for(i=0; i<len/2; i++) 
    { 
     temp=str[i]; 
     str[i]=str[(len-i)-1]; 
     str[(len-i)-1]=temp; 
    } 
    */ 

    while(i!=len-1) 
    { 
    temp=str[i]; 
    str[i]=str[len-1]; 
    str[len-1]=temp; 
    i++; 
    len--; 
    } 

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

return 0; 
} 

は、私は2つのバージョンを持って、一つは非常にうまく機能しているが、他は作る「セグメンテーションエラー:11」私は私が間違ったメモリ位置をアクセスしている場合がありますが、それは私が間違って行っているかを把握するのは非常にトリッキーだと思います。

+2

Eric Lippertの[小さなプログラムのデバッグ方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を読んで、デバッガを使用してクラッシュをキャッチするか、プログラムを1行ずつステップ実行します。 –

+0

コンテンツのためにオフトピックではありません!しかし、これは単なる変数の初期化ではないため、問題は単純なタイプミスで作成されているため、「話題になっていません」と思われる可能性が高くなります。 – Lundin

答えて

6

あなたは0iを初期化する必要があります:あなたは、文字列の先頭から開始するよう

int i = 0; 

。現在、iには未定義の値があり、文字列の境界からメモリにアクセスします。あなたは、文字列の最後に到達したときに停止するように

while (i <= len-1) 

:に

while (i != len-1) 

また、あなたからあなたの状態を変更する必要があります。

+1

そして 'i!= len-1' - >' i BLUEPIXY

+0

@BLUEPIXYはそれを逃した、ありがとう! – Marievi

+0

この場合、コンパイラ(gcc)は、 '-Wall'フラグでも' i'が初期化されていないことを検出しません。私はここにフォローアップ(https://stackoverflow.com/questions/46465442/why-am-i-not-getting-a-warning-here)を投稿しました(最後は重複していました) –

関連する問題