2012-11-06 7 views
0

저는 C 프로그래밍에 익숙하지 않으며 계속이 오류가 발생합니다. 이전에는 나이가 두 배 였으므로 fscanf를 % lf와 함께 사용하고 있었지만 fgets로 바꾼 이후로 double을 허용하는 방법을 모르겠습니다. 구조체를 읽으려고합니다.fgets를 사용하여 구조체에 double을 저장하십시오.

오류 : '더블'의 char * '하지만 인수 유형 인

+1

'는 fgets()가'문자열 ('숯불 *')하지 더블을 읽

재미를 위해 예

. 당신은'fscanf()'또는'strtod()'와 같이 read 문자열을'double'으로 후 처리 할 수도 있습니다. – twalberg

답변

1

fgets 시도 기대는 fgets 의 인수 1 호환되지 않는 유형

double age; 
... 
while(fgets(Employees[i].age, 10, input) != 0) 

날이 오류를 제공합니다 : 여기 내 관련 코드입니다 double 값에만 관심이 있기 때문에 상황에 맞지 않는 텍스트 행을 읽습니다.

while(fscanf(input, "%lf", &Employees[i].age) == 1) 
0

당신은 또한 fgets()를 사용하여 텍스트의 전체 라인을 읽은 다음으로 구문 분석을 시도 할 수 있습니다 :

그래서 그 대신 fgets를 사용하여, 당신은 double 형식 문자열로 fscanf를 사용하는 것이 좋습니다 값은 sscanf()입니다.

sscanf()fscanf()scanf()처럼 작동합니다. 단, 첫 번째 매개 변수는 문자 포인터입니다.

줄 번호별로 오류를보고하거나 sscanf()이 실패하면 다른 형식 문자열을 사용하여 줄을 변환하는 등 한 번에 한 줄 전체를 읽으면 특정 작업을 더 쉽게 수행 할 수 있습니다.

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

int main() 
{ 
    char buffer[1024]; 
    const size_t buffer_size = sizeof(buffer); 
    int line_number = 0; 

    while(fgets(buffer, buffer_size, stdin)) { 
     size_t len = strlen(buffer); 
     double value; 

     line_number++; 

     if(buffer[len-1] == '\n') { 
      buffer[len-1] = '\0'; 
      len--; 
     } 

     if(sscanf(buffer, " %lf", &value) != 1) { 
      fprintf(stderr, "stdin:%d: Unable to read value: \"%s\" makes no sense.\n", line_number, buffer); 
      exit(EXIT_FAILURE); 
     } 
     printf("Successfully read value %lf\n", value); 
    } 
    return EXIT_SUCCESS; 
} 
관련 문제