2014-11-07 2 views
0

fgets()sscanf()을 사용하여 입력 파일을 읽고 구문 분석하려고합니다.형식이 지정된 파일을 스캔 할 때 sscanf 오류가 발생했습니다.

void reading_file(char* file) 
{ 
    FILE *f = fopen(file, "r"); 
    char line[256]; 
    while(fgets(line, sizeof(line), f)) 
    { 
     int i = 0; 
     char str[20]; 
     sscanf(line, "%d %s", &i, str); 
     printf("%d %s\n", i, str); 
    } 
} 

입력 파일은 다음과 같습니다 : 여기 (단지 관련 부분이 여기에 나열됩니다) 내 기능입니다

0 be68c5bc1ee7be6f20728579ee082aed6214825b 
1 e2d6c1bb794ff4545ef2f101ca904dbbb3ed3923 

이 코드 조각의 출력은 다음과 같습니다 완전히

875849270 aa71dbd21bd2b05f3bd261256f443fd5f9f7272e 
1633890352 465c63da3d0168553c1027eb00ca364c337ced44 

잘못된.

재미있는 부분은 여기에 있습니다. 구조체를 사용하여 입력 라인을 유지하면 출력이 정확합니다! 수정 후의 코드는 다음과 같습니다.

typedef struct s_s{ 
    int id; 
    char hash[20]; 
} s_t; 

void reading_file(char* file) 
{ 
    FILE *f = fopen(file, "r"); 
    char line[256]; 
    while(fgets(line, sizeof(line), f)) 
    { 
     s_t s; 
     sscanf(line, "%d %s", &s.id, s.hash); 
     printf("%d %s\n", s.id, s.hash); 
    } 
} 

출력은 입력 파일과 동일합니다. 왜 그런가요? 누구든지 설명이 있습니까?

+1

길이가 긴 문자열을 읽고 싶을 때 왜'char str [20];'입니까? –

+1

정의되지 않은 동작을 유발하는 코드의 동작을 이해하려고 시도하는 것은 의미가 없습니다. –

+1

문제가 해결되어 다행입니다. 아래에 게시 된 답변 중 어떤 것이 문제를 해결하는 데 도움이되었다고 생각되면 답변 옆에있는 화살표를 클릭하여 문제를 수락하는 것이 좋습니다. 일단 당신이 대답을 수락하면, 응답자와 당신은 약간의 명성을 얻습니다. 충분한 명성으로 당신을 도운 대답에 투표 할 수 있습니다. 또한 다른 독자들에게 유용하게 사용할 수 있도록 답변 플롯을 허용했습니다. –

답변

0
  1. while(fgets(line, sizeof(line), file))while(fgets(line, sizeof(line), f)) 안? fgets()의 man page을 확인할 수 있습니다.

  2. 다음으로, char str[20];string의 파일에서 입력이 더 이상 20 charracters의보다, 때문에 char str[128]; 같은 것으로 변경해야하는 코드에서 문제를 해결합니다.

그러나 IMO의 올바른 답을 반환하는 구조의 사용, Undefined behaviour의 일부이다.

관련 문제