2017-02-16 1 views
0

사용자가 float 값을 입력하지 않고 enter를 누르면 while 루프를 종료하는 프로그램이 필요합니다. 감사!사용자가 scanf에 빈 줄을 입력했는지 확인하는 방법

printf("Enter scores\n”); 

float scores[10]; 
int n=0;  

while (n<10){ 

    scanf("%f", &scores[n]); 
    n++; 
    if (THE USER PRESSES ENTER WITHOUT ENTERING ANYTHING){break;} 

} 
+0

실제 항목을 코딩 할 때'scanf()'를 사용하지 않아야합니다. –

+0

나는 gets()를 시도하겠다. – mosh442

+5

@ mosh442 : 절대 gets()하지 마라! SO는 건강한 생활 사이트이며'gets()'를 사용하면 건강에 좋지 않은 상태가됩니다. 자,'fgets()'는 전혀 다른 문제입니다. –

답변

-2

입력에서 가져온 정의 된 유형이없는 경우 scanf는 음수 값을 반환합니다.

그래서 :

printf("Enter scores\n”); 

float scores[10]; 
int n=0;  

while (n<10){ 

    if(scanf("%f\n", &scores[n]) < 0) printf("Error! Error!"); 

    n++; 
} 

http://www.cplusplus.com/reference/cstdio/scanf/

+1

하지만 줄 바꿈을보고 있기 때문에 멈추지 않습니다. – rici

+2

'scanf()'는 EOF를 반환합니다. 그러나,'scanf()'는 첫 번째 불일치가 발생하거나 파일의 끝에 도달했을 때 리턴한다. 따라서 eof에 도달하지 않으면 변환이 수행되지 않으면 0이 리턴됩니다. 'scanf()! = 1'을 테스트해야합니다. 그리고'% f' 변환은 줄 바꿈을 포함하여 선행 공백을 건너 뜁니다. –

+0

@DavidBowling 누락 된 \ n을 추가했습니다. – bearaqua

-1

를 참조하십시오 나는 생각했다. 정수에 값이 할당되었는지 확인하고 싶습니까? 사실 변수를 초기화해야합니다. 그렇지 않으면 전역 변수로 선언되지 않는 한 해당 메모리 위치에서 발생하는 모든 것을 포함합니다. 당신은 확인 후 this might help you with your question

+1

코드가 정수가 아닌 부동 소수점 숫자를 읽습니다. 나는 당신이 질문의 요점을 놓쳤다 고 생각한다 - 이것은'scanf()'함수 군을 사용하면서 공백 라인이 언제 입력되는지를 탐지하는 것에 관한 것이다. –

3

을받지 않으면 당신은 버퍼에 개행 문자를 입력 한 줄을 읽어 fgets()을 사용하고 버퍼의 내용을 구문 분석 sscanf()를 사용할 수 있습니다. 이것에 대해 scanf()을 사용할 때의 문제점은 대부분의 변환 지정자, 특히 %f 변환 지정자는 줄 바꿈을 포함하여 선행 공백을 건너 뜁니다. 따라서 scanf()에 빈 줄을 지정하려고하면 함수는 공백이 아닌 문자를 입력 할 때까지 입력을 기다립니다.

아래 코드는이 기술을 사용자 코드에 적용합니다. 변수 nsize_t 유형 변수로 변경되었습니다. 이는 배열 색인을 보유 할 수 있도록 보장 된 부호없는 유형이므로 변경되었습니다. 또한 확인해야 할 fgets()sscanf() 반환 값을 유의하십시오. fgets() 함수는 오류가 있으면 null 포인터를 반환하고 아래 코드는 오류 메시지를 인쇄하고이 경우 발생합니다. sscanf() 함수는 성공한 변환 횟수를 반환하며이 값을 사용하여 입력 값이 예상 한 값과 같은지 확인할 수 있습니다. 사용자가 공백 행 또는 선행 부동 소수점 값이없는 행 (선행 공백은 유효)을 입력하면 0이 리턴되고 입력 루프는 이스케이프됩니다.

배열에 입력 된 값을 표시하는 코드를 추가했습니다.

#include <stdio.h> 
#include <stdlib.h>     // for exit() 

int main(void) 
{ 
    float scores[10]; 
    char buffer[100]; 
    size_t n = 0; 

    printf("Enter scores\n"); 

    while (n < 10){ 
     if (fgets(buffer, sizeof(buffer), stdin) == NULL) { 
      fprintf(stderr, "Error in fgets()\n"); 
      exit(EXIT_FAILURE); 
     } 

     if (sscanf(buffer, "%f", &scores[n]) == 1) { 
      ++n; 
     } else { 
      break; 
     } 
    } 

    for (size_t i = 0; i < n; i++) { 
     printf("scores[%zu] = %f\n", i, scores[i]); 
    } 

    return 0; 
} 

샘플의 상호 작용 : 파싱 사용자 텍스트

Enter scores 
3.8 
3.6 
2.9 
3.4 

scores[0] = 3.800000 
scores[1] = 3.600000 
scores[2] = 2.900000 
scores[3] = 3.400000 
2

개별 입력.
사용자 입력의 라인을 문자열로 읽습니다. 이제

char buffer[80]; 
if (fgets(buffer, sizeof buffer, stdin) == NULL) Handle_EOF(); 

if (sscanf(buffer, "%f", &scores[n]) == 1) Handle_Successful_Float_Input(scores[n]); 
else if (buffer[0] == '\n') Handle_Empty_Line(); 
else Handle_Everything_Else(buffer); 
+1

@DavidBowling 간혹 OP가 간결한 답변처럼 표시되며 언젠가 자세한 정보가 표시됩니다. 자사의 동전 던지기는 사람들에게 가장 적합한 것입니다. – chux

0

fgets는 더 나은 경로지만는 scanf를 사용해야하는 경우, 개행 문자를 스캔하여 검출 할 수 등 sscanf(), strtod()를 사용하여 문자열을 구문 분석합니다. 문자가 개행 문자가 아닌 경우 입력에서 ungetc으로 바꾸고 float를 스캔합니다.

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

#define SIZE 10 

int main (void) { 
    char i = '\0'; 
    int n = 0; 
    int result = 0; 
    float scores[SIZE] = { 0.0f}; 

    printf ("enter scores\n"); 
    while (n < SIZE && (scanf("%c",&i) == 1)) {//scan a character 
     if (i == '\n') { 
      break;//newline so leave loop 
     } 
     else { 
      ungetc (i, stdin);//replace the character in input stream 
     } 
     if ((result = scanf ("%f", &scores[n])) == 1) {//scan a float 
      printf (" score[%d] entered as %f\n", n, scores[n]); 
      n++; 
     } 
     if (result == 0) { 
      printf ("please enter a number\n");//could not scan the input as a float 
     } 
     while ((result = getchar ()) != '\n') {//clean the input stream 
      if (result == EOF) { 
       fprintf (stderr, "problem EOF\n"); 
       return 1; 
      } 
     } 
     printf ("enter score[%d]\n", n); 
    } 
    return 0; 
} 
관련 문제