2016-09-05 5 views
-5

"Hello"の入力を受け取り、文字の順序を逆転させて "olleH"を出力するプログラムを作ろうとしています。しかし、私はセグメンテーションフォールトを得続けると私は理解していない理由をCプログラミング、セグメンテーションフォールトコアダンプ

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

int main() 
{ 
    int i; 
    int size; 
    char s[100],a[100]; 

    printf("Enter the word you want to get reversed: "); 
    scanf("%s",s); 


    while(s[i]!='\0') 
{ 
    a[i]=s[i]; 
    i++; 
} 

size=sizeof(s); 

    while(i<sizeof(s)) 
    { 
     s[i]=a[size]; 

    } 

    printf("The reversed string is : %s",s); 


} 
+0

ヒント: 'サイズ=さはsizeof(S);'間違っている... –

+0

'(i)は、S(のsizeofを<)しながら、{S [i]は[サイズ] =。 } 'は、未定義の振る舞いのそばで無限ループになります。 – haccks

+1

また、「i」は初期化されていない、UPの別の抜け穴が使用されていることに注意してください。 – haccks

答えて

0

問題は、この部分にある:あなたが入力から読み込ま文字列が未満とすることができるのに対し、

size=sizeof(s); 

while(i<sizeof(s)) 
{ 
    s[i]=a[size]; 
} 

sizeof(s)は100になりますそれはsの未初期化部分にアクセスするとundefinedになります。したがって、strlen()を使用して文字列の実際のサイズを取得し、それを逆にします。

scanf()は書かれているように安全ではありません(100文字を超える文字を入力するとどうなりますか)。代わりにfgets()を使用することをおすすめします。

0

もう1つの簡単な方法で文字列を元に戻すことができます。

ことは、これを試してみてください:

while(s[++i]!='\0'); // find the size of string 

    while(i>=0) 
    a[j++] = s[--i]; // reverse the string 

    a[j]='\0'; 
    printf("The reversed string is : %s",a); 
0

インデックスiが(それが最初に正しく初期化されたものとする)入力した文字列の外を指す値を持っているので、このwhileループ

while(i<sizeof(s)) 
{ 
    s[i]=a[size]; 

} 

は意味がありません。ループ内でiが変更されていない(初期化されていない)ので、ループは無限大であり、このステートメントの右辺式も同様です。

s[i]=a[size]; 

は常に同じで、アレイ外のメモリも参照します。

<string.h>で宣言された関数のどちらもプログラムで使用されていないことを考慮してください。ヘッダーは削除される可能性があります。

プログラムは、あなたが補助配列を使用せずに文字列を逆にすることができ、次のよう

#include <stdio.h> 

#define N 100 

int main() 
{ 
    char s[N], d[N]; 

    printf("Enter the word you want to get reversed: "); 
    fgets(s, N, stdin); 

    size_t n = 0; 

    while (s[n] != '\0' && s[n] != '\n') n++; 

    for (size_t i = 0; i != n; i++) d[i] = s[n-i-1]; 
    d[n] = '\0'; 

    printf("The reversed string is : %s\n", d); 

    return 0; 
} 

を見ることができます。例えば

#include <stdio.h> 

#define N 100 

int main() 
{ 
    char s[N]; 

    printf("Enter the word you want to get reversed: "); 
    fgets(s, N, stdin); 

    size_t n = 0; 

    while (s[n] != '\0' && s[n] != '\n') n++; 
    s[n] = '\0'; 

    for (size_t i = 0; i < n/2; i++) 
    { 
     char c = s[i]; 
     s[i] = s[n-i-1]; 
     s[n-i-1] = c; 
    } 

    printf("The reversed string is : %s\n", s); 

    return 0; 
}