2012-01-06 5 views
0

저는 C 프로그래밍에 다소 익숙합니다 ... 사용자 이름과 텍스트 파일에서 사용자 이름을 읽으려고합니다 ... 첫 번째 파일 작동하지만 텍스트 파일을 읽고 "user_name"에 저장하면 세그먼트 화 오류가 발생합니다. 여기서 뭐가 잘못 됐니?C에서 문자열로 텍스트 파일을 읽는 중 세그먼트 오류가 발생했습니다

char user_in[10]; 
char user_name[10]; 
scanf("%s",user_in); 
FILE *users_file; 
users_file=fopen("users.txt","r"); 
fscanf(users_file,"%s",user_name);// segmentation error 

(EDITED) : 이 파일이 (내가 그것을 테스트 한) 존재한다. 첫 번째 내용은 공백이 오는 5 자 긴 문자열입니다.

Sarah Mary Sally 
+0

: 다른 사람이 말했듯이

또한, 성공적으로 파일을 열어 확인? 새로운 라인이나 다른 공백 문자 앞에 첫 줄이 9 자보다 길면 끝 부분에 널 종료 자'\ 0'을 넣을 때 버퍼 끝에서 계속 실행됩니다. –

+1

파일이 있습니까? fopen이 성공했는지 확인 했습니까? – Mysticial

+0

너무 빨리 데이터 파일을 proivde - 빠른 추측은 9 바이트에 맞는 것입니다. –

답변

1

할당 된 배열 크기 인 user_name 이상으로 덮어 쓰지 않아야합니다. 파일이 user_name에 할당 된 메모리보다 더 들어있는 경우

당신은 거기에 콘텐츠를 저장하기에 충분한 공간이 아니며, 그것이 정의되지 않은 동작의 원인이 할당 된 메모리의 경계를 overwrittes, user_name에게 10 문자의 메모리를 할당 할 수 세분화 오류가 발생합니다.

또한 프로그램에 오류 처리가 없습니다. 예 : fopen 호출이 성공했는지 확인해야합니다.
즉, c 표준 라이브러리 함수를 사용할 때마다 항상 함수가 성공했는지 확인하십시오.

+0

내가 그랬어! 이것은 내 프로그램의 작은 부분입니다 ... – Sarah

0

프로그램이 파일에서 읽은 내용의 크기가 user_name의 크기를 초과합니다. 버퍼 오버플로가 발생하고 함수 스택이 중단됩니다.

0
당신은 더 나은 당신이 마지막, 열 번째 문자가 값이 제로가 있기 때문에 표현하기 위해, 길이로 구를 지정

scanf("%9s", user_in); 

fscanf(users_file, "%9s", user_name); 

는 scanf의 크기()를주는 것

문자열의 끝. USERS.TXT의 내용은 무엇

#include <errno.h> /* errno */ 
#include <string.h> /* strerror() */ 


users_file = fopen("users.txt","r"); 
if(!users_file){ 
    fprintf(stderr, "couldn't open users.txt: %s\n", strerror(errno)); 
    return 1; 
} 
+0

또한, scanf() 공백에서 중지합니다. 파일의 텍스트 만 원하면 fgets를 사용하십시오 : fgets (user_name, user_file); –

관련 문제