2012-03-25 2 views
0

이 코드는 파일에서 정수를 가져 와서 정렬하고 정렬 할 정수의 수인 파일의 첫 번째 정수를 가져오고 그 뒤에 오는 정수는 정렬 할 정수입니다 . 나는 fgets와 sscanf가 함께 작동하는 방법을 모르겠다. 누군가가이 코드에서 fgets와 sscanf가 어떻게 작동하는지 설명 할 수 있습니까?fgets and sscanf

FILE *finput; 
int *array_int, c1, no_elem; 
char numlines[500]; 

fgets(numlines, 500, finput); 
array_int = (int *)malloc(sizeof(int)*no_elem); 
if ((sscanf(numlines, "%d", &no_elem) == 1) && array_int!= NULL) 
{ 
    for(c1=0; fgets(numlines, 500, finput) != NULL;) 
    { 
     if (sscanf(numlines, "%d", &array_int[c1])==1) 
     { 
      ++c1; 
     } 
    } 
} 

답변

3

fgets은 파일에서 문자열 (즉, 텍스트 행)을 가져옵니다.

sscanf은 형식 문자열을 기반으로 문자열을 구문 분석합니다. sprintf의 반대입니다. <x>printf 및 일치하는 <x>scanf 함수는 표준 형식 문자열과 함께 형식화 된 출력 및 입력을 허용합니다. 예를 들어, "%d"은 "부호가있는 정수 값"을 의미하고 <x>scanf의 컨텍스트에서 "다음 매개 변수 목록의 다음 매개 변수로 읽습니다"(귀하의 경우에는 배열 구성원)를 의미합니다.

fscanf을 사용하여 파일에서 직접 구문 분석 할 수 있지만 fgets + sscanf을 사용하면 더 많은 유연성을 얻고 더 안전 할 수 있습니다.

+0

'fscanf'가 안전하지 않은 이유의 예를 추가 할 수 있습니까? – galymzhan

+0

@galymzhan은 내 머리 꼭대기에서 벗어날 수 없다. 왜? – littleadv

+0

그래서 fgets는 정수를 얻고 sscanf는 그 정수를 array_int에 할당합니까? 내가 맞습니까? 왜 sscanf에 == 1이 있습니까? – John