programing

C에서 EOF 검출

powerit 2023. 10. 30. 21:19
반응형

C에서 EOF 검출

EOF가 발생할 때까지 사용자의 입력을 받기 위해 아래의 C 코드를 사용하고 있습니다만, 문제는 이 코드가 작동하지 않는다는 것입니다, 첫 번째 입력을 받은 후에 종료됩니다.이 코드에 무슨 문제가 있습니까?

float input;
 
printf("Input No: ");
scanf("%f", &input);
    
while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}

EOF는 값(일반적으로 -1)을 가진 매크로일 뿐입니다.당신은 어떤 것을 시험해 봐야 합니다.EOF, 예를 들면 A의 결과와 같은getchar()불러.

스트림의 끝을 테스트하는 한 가지 방법은feof기능.

if (feof(stdin))

'스트림 종료' 상태는 읽기 실패 에만 설정됩니다.

예제에서는 scanf의 반환 값을 확인해야 할 것이며, 이 값이 필드를 읽지 않았음을 나타내는 경우 파일의 끝을 확인해야 합니다.

EOF는 C의 상수입니다.EOF에 대한 실제 파일을 확인하고 있지 않습니다.당신은 이런 일을 해야 합니다.

while(!feof(stdin))

여기에 제공해야 할 문서가 있습니다.scanf의 return 값도 확인할 수 있습니다.성공적으로 변환된 항목 수를 반환합니다.EOF파일의 끝에 도달한 경우.

또 다른 문제는 당신이 함께 읽고 있다는 것입니다.scanf("%f", &input);뿐. 사용자가 "pi"와 같이 C 부동소수점 숫자로 해석할 수 없는 것을 입력하는 경우,scanf()호출은 아무것도 할당하지 않습니다.input, 거기서 더 이상 진행되지 않을 겁니다.이는 "pi"를 계속 읽으려고 시도하고 실패한다는 것을 의미합니다.

변경 사항을 고려할 때while(!feof(stdin))만약 당신이 "pi"를 입력한다면, 그 이전의 가치를 출력하는 끝없는 루프가 있을 것입니다.input프롬프트를 출력하지만 프로그램은 새로운 입력을 처리하지 않습니다.

scanf()지정한 입력 변수에 대한 할당 수를 반환합니다.만약 할당하지 않았다면 부동 소수점 번호를 찾지 못했다는 뜻이고, 다음과 같은 내용으로 더 많은 입력을 읽어봐야 합니다.char string[100];scanf("%99s", string);. 이렇게 하면 입력 스트림에서 다음 문자열이 제거됩니다(어쨌든 최대 99자 - 추가).char는 문자열의 null 터미네이터를 위한 것입니다).

내가 싫어하는 이유들이 생각나는군요scanf(), 그리고 내가 왜 사용하는지는fgets()대신에, 그리고 아마도 그것을 사용해서 파싱할 수도 있습니다.sscanf().

시작점으로서 당신은 대체를 시도할 수 있습니다.

while(!EOF)

와 함께

while(!feof(stdin))

scanf()의 결과를 확인하여 변환이 성공적으로 이루어졌는지 확인하려고 합니다. 그렇지 않은 경우 세 가지 중 하나가 참입니다.

  1. scanf()가 %f 변환 지정자에 대해 유효하지 않은 문자(즉, 숫자, 점, 'e' 또는 'E'가 아닌 문자)에서 질식하고 있습니다.
  2. scanf()가 EOF를 검출했습니다.
  3. scanf ()에서 stdin을 읽을 때 오류가 감지되었습니다.

예:

int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
 * Loop while moreData is true
 */
while (moreData)
{
  errno = 0;
  int itemsRead = scanf("%f", &input);
  if (itemsRead == 1)
  {
    printf("Output: %f\n", input);
    printf("Input no: ");
    fflush(stdout);
  }
  else
  {
    if (feof(stdin))
    {
      printf("Hit EOF on stdin; exiting\n");
      moreData = 0;
    }
    else if (ferror(stdin))
    {
      /**
       * I *think* scanf() sets errno; if not, replace
       * the line below with a regular printf() and
       * a generic "read error" message.
       */
      perror("error during read");
      moreData = 0;
    }
    else
    {
      printf("Bad character stuck in input stream; clearing to end of line\n");
      while (getchar() != '\n')
        ; /* empty loop */
      printf("Input no: ");
      fflush(stdout);
    }
 }
while(scanf("%d %d",a,b)!=EOF)
{

//do .....
}

언급URL : https://stackoverflow.com/questions/1428911/detecting-eof-in-c

반응형