2016-10-08 1 views
5

이 구조체를 테스트 해본 결과 gets에 대한 경고 메시지가 표시됩니다. 누군가 fgets을 대신 사용하고 끝 부분을 '\0'으로 바꿉니다. 어떤 코드를 어떻게 변경할 수 있습니까?gets()를 fgets()로 대체하십시오.

void regCars(Car reg[], int *pNrOfCars) { 
    char again[WORDLENGTH] = "yes", model[WORDLENGTH], tmp[WORDLENGTH]; 
    int year, milage; 

    while (strcmp(again, "yes") == 0) { 
     printf("Enter model:"); 
     gets(model); 
     printf("Enter Year:"); 
     gets(tmp); 
     year = atoi(tmp); 
     printf("Enter milage:"); 
     gets(tmp); 
     milage = atoi(tmp); 
     reg[*pNrOfCars] = createCar(model, year, milage); 
     (*pNrOfCars)++; 
     printf("Continue? (yes/no)"); 
     gets(again); 
    } 
} 

답변

0

당신은 유틸리티 기능이 개 인수를 mygets()을 쓸 수 있습니다

char *prompt(const char *message, char *dest, size_t size) { 
    printf("%s ", message); 
    fflush(stdout); 
    /* read a line from standard input and strip the linefeed if any */ 
    if (fgets(dest, size, stdin)) { 
     dest[strcspn(dest, "\n")] = '\0'); 
     return dest; 
    } 
    return NULL; 
} 

void regCars(Car reg[], int *pNrOfCars) { 
    char model[WORDLENGTH], tmp[WORDLENGTH]; 
    int year, milage; 

    for (;;) { 
     if (!prompt("Enter model:", model, sizeof mode)) 
      break; 
     if (!prompt("Enter year:", tmp, sizeof tmp)) 
      break; 
     year = atoi(tmp); 
     if (!prompt("Enter milage:", tmp, sizeof tmp)) 
      break; 
     milage = atoi(tmp); 
     reg[*pNrOfCars] = createCar(model, year, milage); 
     (*pNrOfCars)++; 
     if (!prompt("Continue? (yes/no)", tmp, sizeof(tmp)) 
      break; 
     if (strcmp(again, "yes") != 0) 
      break; 
    } 
} 

는 또한이 기능은의 크기를해야 참고 : 질문과 응답을 읽고배열이 가득 차면 더 많은 입력을 요구하는 배열을 중지합니다. 현재 지정된대로 gets()과 동일한 단점이 있으며 예기치 않은 입력으로 인해 정의되지 않은 동작이 발생합니다.

+0

@Alex : 답변을 수락 하시겠습니까? – chqrlie

0

그냥 예를

if (NULL != fgets(model, WORDLENGTH, stdin)) /* Read the string. */ 
{ 
    model[strcspn(model, "\r\n")] = '\0'; /* Cut off \n and/or \r, if any. */ 
} 
+0

내가 생각하기에 이것은 모델을위한 것일뿐입니다. int와 char를 곱하면 모든 것을 살펴보고 \ n을 대체 할 수있는 함수가 있습니까? – xxFlashxx

+0

@Alex :'fgets()'('get()'뿐만 아니라)는 "strings"만을 읽습니다. "year"를 읽으려면,'gets (tmp)'를 사용하면 그림과 같이 바꿀 수 있습니다. – alk

+0

그래서 fgets (모델) 바로 뒤에 if 문을 삽입 하시겠습니까? – xxFlashxx

1

그것은 보이는 것보다 약간의 잔재주의 위해 할. 너가 긴 입력에 잘린 선을 처리하고 그것을 유효한 것으로 취급하면 fgets()로 단지 gets를 대체하는 것만으로는 충분치 않다. 정의되지 않은 동작을 잘못된 동작으로 대체했을뿐입니다. 포인터를 대상 배열 및 크기에 : 당신이를 출력하는 prompt() 기능을 더 많은 코드를 인수 분해 할 수

char *mygets(char *dest, size_t size) { 
    /* read a line from standard input and strip the linefeed if any */ 
    if (fgets(dest, size, stdin)) { 
     dest[strcspn(dest, "\n")] = '\0'); 
     return dest; 
    } 
    return NULL; 
} 

void regCars(Car reg[], int *pNrOfCars) { 
    char model[WORDLENGTH], tmp[WORDLENGTH]; 
    int year, milage; 

    for (;;) { 
     printf("Enter model:"); 
     if (!mygets(model, sizeof mode)) 
      break; 
     printf("Enter year:"); 
     if (!mygets(tmp, sizeof tmp)) 
      break; 
     year = atoi(tmp); 
     printf("Enter milage:"); 
     if (!mygets(tmp, sizeof tmp)) 
      break; 
     milage = atoi(tmp); 
     reg[*pNrOfCars] = createCar(model, year, milage); 
     (*pNrOfCars)++; 
     printf("Continue? (yes/no)"); 
     if (!mygets(tmp, sizeof(tmp)) 
      break; 
     if (strcmp(again, "yes") != 0) 
      break; 
    } 
} 

if(fgets(line, sizeof(line), fp)) 
{ 
    if(!strchr(line, '\n')) 
    { 
     /* line is too long, what you do is up to you, but normally 
     we will discard it */ 
     int ch; 

     while((ch = fgetc(fp)) != EOF) 
     if(ch == '\n') 
      break; 

    } 
    else 
    { 
     /* line is a normal line with a trailing '\n' (gets trims the '\n')   */ 
    } 
} 
+0

그냥 긴 줄을 버릴 필요가 없습니다 ... 그리고 긴 줄은 컴퓨터 프로그램에 의해 작성된 텍스트 파일에서 꽤 자주 발생합니다. 'fgets()'는 그것들을 읽을 수있다 ... 더 많은 호출과 그것을 처리하는 논리가 필요하다. – Peter

+0

유효 라인에 제한이없는 경우, fgets()는 선택한 입력 함수가 아닙니다. 물론 긴 줄이 의미하는 것은 상황에 따라 결정되며 때로는 그것을 버리는 것이 잘못되었습니다. 조용히 잘라내어 나머지를 전체 라인과 구별 할 수 없게 만드는 것은 거의 정확한 동작이 아닙니다. –

관련 문제