2017-03-10 3 views
0

문자열을 읽는 간단한 프로그램을 작성했습니다.c에서 stdin에서 문자열 읽기

void main() 
{ 
    char *str; /*didn't allocate memory*/ 
    scanf(" %s",str); 
    printf("%s",str); 
} 

하지만 세그먼트 오류가 발생합니다. 반면에 다음은 그렇지 않습니다.

void main() 
{ 
    char *str; 
    scanf(" %c",str); 
    printf("%c\n",str); 
} 

이 기능이 실제로 어떻게 작동하는지 명확히 알 수 있습니까?

+7

로컬 비 정적 변수에는 * indeterminate * 값이 있습니다. 포인터와 같은 변수가있을 때 이것을 역 참조하면 * 정의되지 않은 동작이 * 생깁니다. 종종 일어날 일을 예측할 방법이 없습니다. –

+0

호기심에서 벗어나 두 번째 프로그램을 컴파일하고 실행했습니다. 그것은 추락했다. 정의되지 않은 동작은 다른 컴퓨터, 운영 체제 및 컴파일러 조합에서 다르게 나타날 수 있습니다. –

+3

"실제로 작동하는 방법을 분명히 밝힐 수 있습니까?" - * 그렇지 않습니다. *; * 정의되지 않은 동작 *을 호출합니다. 당신은 "작품"에 대한 정의가 프로그램이 단순히 "충돌하지 않는다"고 생각하기 때문에 성공에 대한 부드러운 생각으로 빠져 들었습니다. 정의되지 않은 동작을 호출하는 잘못된 형식의 프로그램은 확실히 그렇게 할 수 있습니다 (또는하지 않을 수도 있음). * 운이 좋지 않으면 작동 할 수도 있습니다. 더 나쁠 수 있습니다. 강사, 고용주 또는 최악의 고객이 아닌 귀하를 위해 "일할"수있었습니다. – WhozCraig

답변

0

문자열이 할당되지 않았습니다. 이것은 당신이 요구하지 않은 곳에 당신이 쓰고 있다는 것을 의미합니다.

그러나 당신이 할 수있는 것은 :

#include <stdio.h>  
#include <stdlib.h> 

int main(int argc, char *argv[]) 

{ 
    char c; 
    while (scanf("%c",&c) && c != '\n') 
    printf("%c",c); 
    printf("\n"); 

    return 0; 
} 

그것은 당신이 수익을 누를 때까지 당신이 입력에 보내는 모든 문자를 읽습니다.

+0

'getchar'는'scanf'보다 더 자연 스럽습니다. scanf를 사용하는 경우 eof에 0이 아닌 EOF를 반환하고 EOF는 "true"값이라는 것을 기억하십시오. 마지막으로 공백을 건너 뛰지 않습니다. – rici

+0

입니다. 왜냐하면 공백을 건너 뛰기위한 것이 아니기 때문입니다. 왜 단어 사이의 공백을 건너 뛰고 싶습니까? –

+1

이유가 무엇이든간에. OP는'scanf '포맷의 첫 번째 charcter로 공백을 사용하며, 작업은 공백을 정확하게 건너 뛰므로 제안 된 코드는 동일하지 않습니다. – rici