2016-09-05 2 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 (들) (I는를 sizeof <(S)) 동안 잘못 '는 .. –

+0

'{(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

문자열을 되돌릴 수있는 또 다른 간단한 방법입니다.

이 시도 :

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

이 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; 
}