2016-07-13 9 views
0

먼저 불량한 영어로 죄송합니다. 나는 많은 웹 사이트에서이 질문에 대한 참고로 많은 서핑을하고 있었지만 아직 정확한 대답을 찾지 못했습니다.C 프로그래밍 - "공간 (& # 32)"입력을 허용/확인/확인

사용자가 정수를 입력하지 않은 경우이 프로그램에서 확인할 수있는 C 프로그램을 만들려고합니다. 사용자가 정수를 입력하지 않은 경우 사용자가 프로그램에 정수를 입력하라는 등의 프롬프트가 다시 표시됩니다. scanf() 반환 값을 조건문에 사용할 때 모두 괜찮지 만 문제는 '공백/공백/공백'(아스키 코드 & # 32)을 입력하고 '입력'을 누르면 내 프로그램이 계속 실행됩니다. 사용자 입력을 위해 문자 또는 정수를 기다리는 것.

입력이 'whitespace/blackspace/space'인 경우 프로그램은 사용자에게 정수를 입력하라는 메시지를 반복하거나 프로그램이 중지되기를 바란다. 나는 C에서 초보자,이 궁금합니다

#include <stdio.h> 

int main() { 

    int number, isInt; 

    printf("Input a number : "); 

    do { 
     if ((isInt = scanf("%d", &number)) == 0) { 
      printf("retry : "); 
      scanf("%*s"); 
     } else if (number < 0) { 
      printf("retry : "); 
     } 
    } while (isInt == 0 || number < 0); 

    printf("%d\n", number); 

    return 0; 
} 

: 여기

케이스 코드입니다. 나는 % [^ \ n] < - scanf() 문자열에 대한 코드 형식을 사용하고이를 정수로 변환하면 프로그램이 올바르게 실행된다는 것을 안다. % d 코드 형식을 사용하여이 문제를 해결할 다른 방법이 있습니까? 또는 scanf()를 사용합니까? 공백을 무시하고 그것이 변환을 수행하기 전에 비 공백을 찾을 때까지 계속 찾고 것이다 D

+0

는 scanf()를 같은 것을 처리하지 않습니다 http://stackoverflow.com/questions/6582322/what-does-space-in-scanf-mean에 대한 답변을 참조하십시오. 시도해보십시오. http://stackoverflow.com/questions/3765023/how-do-i-read-white-space-using-scanf-in-c?rq=1 – Toby

+0

'scanf ("% 1을 (를) 통해 문자를 하나씩 읽습니다. c ", & character)'그리고 읽은 문자열을 정수로 변환하는 것은 하나의 해결책입니다. 'scanf()'를 사용하지 않아도된다면, getchar()가 더 유용 할 것이다. – MikeCAT

답변

0

scanf :

것은 내 호기심, 안부을 깰 도와주세요.

fgets를 사용하여 입력 행을 얻은 다음 with sscanf를 처리하는 것이 좋습니다. 이런 식으로 뭔가 : 사용자가 그 문자를 입력하면

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

int main() {  
    int number=-1;  
    printf("Input a number : "); 
    do { 
     char line[80]; 
     if(!fgets(line,sizeof(line),stdin)){ 
      printf("line read error\n"); 
      exit(1); 
     } 
     if (sscanf(line,"%d", &number) !=1) { 
      printf("retry : "); 
     } else if (number < 0) { 
      printf("retry : "); 
     } 
    } while (number < 0); 
    printf("%d\n", number); 
    return 0; 
} 
+0

할당 억제 문자'*'가있어'scanf ("% * s")'호출이 정의되지 않았습니다. 다음 입력 문자열을 읽지 만 지정하지는 않습니다. –

+0

내 실수 ... – evaitl

+0

을 고치기 이것은 내 호기심 문제를 정확히 해결하고 싶습니다. Thnx 형제 (y)! –

0

는 형식 지정자 '%의 * s'가 그 공백 (탭, 공백, 줄 바꿈)가 발생하면 문자를 입력 중지 그래서 것 그들이 소모되지 않습니다 .

'% d'은 (는) 모든 선행 공백을 사용합니다. 사용자가 어떤 "유효"수를 입력 할 때, 사용자가 어떤 ASCII 값을 입사 한 경우 'A'다음 '% (D)이 마침 것처럼

다음 코드는'다른 '문

로 연결 떨어질 코드를 입력하면 'else'문으로 넘어갑니다. 그 때 'number'변수가 설정되지 않았습니다 'number'는 'number 변수가있는 스택에있는 모든 휴지통을 포함합니다. 값은 EOF

'백 스페이스 키'것 같이, 0 또는 1 이외의 것이 될 수있다 '는 scanf()에 대한 호출로부터 리턴 0

보다 큰 정수 될 일이'있다 '고 터미널 드라이버가 소비하므로 결코 프로그램에 도달하지 마십시오.

귀하의 프로그램은 예상되는 바를 정확히 수행하지만 원하는 바가 아닐 수도 있습니다.

0

%s은 공백을 다시 볼 때까지 이 아닌 공백 문자를 읽습니다. 따라서 적어도 하나의 공백이 아닌 문자가 나타날 때까지 scanf("*%s"); 호출이 차단됩니다.

scanf("%*[^\n]"); 

신속하고 더러운 시험이 "작품"더 나은 정직하지만, : 그 허용 대체 할 수 있도록

%[ 변환 지정자는 , 선행 공백을 건너되지 것 접근 방식은 모든 입력을 텍스트로 읽은 다음 strtol을 사용하여 텍스트를 대상 유형으로 변환합니다. 여기에 내가 무엇을 의미하는지에 대한 실무 예제 :

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

#define BUF_SIZE 20 

int main(void) 
{ 
    int value = -1; 
    char buf[BUF_SIZE]; 

    do 
    { 
    printf("Gimme a non-negative value: "); 
    if (fgets(buf, sizeof buf, stdin)) 
    { 
     char *newline = strchr(buf, '\n'); 
     if (!newline) 
     { 
     printf("Input too long for buffer, flushing..."); 
     while (fgets(buf, sizeof buf, stdin) && !strchr(buf, '\n')) 
      ; 
     printf("try again\n"); 
     } 
     else 
     { 
     *newline = 0; // Remove the newline character from the buffer 

     char *chk; // chk will point to the first character *not* converted 
         // by strtol. If that character is anything other 
         // than 0 or whitespace, then the input string was 
         // not a valid integer. 

     int tmp = (int) strtol(buf, &chk, 0); 
     if (*chk != 0 && !isspace(*chk)) 
     { 
      printf("%s is not a valid integer, try again\n", buf); 
     } 
     else if (tmp < 0) 
     { 
      printf("%d is negative, try again\n", tmp); 
     } 
     else 
     { 
      value = tmp; 
     } 
     } 
    } 
    else 
    { 
     printf("Input failure, bailing out completely\n"); 
     break; 
    } 
    } while (value < 0); 

    printf("value is %d\n", value); 
    return 0; 
} 

그리고, 여기에 각 테스트 케이스에 운동 실행에서 예입니다

$ ./format2 
Gimme a non-negative value: Supercalifragilisticexpealidocious 
Input too long for buffer, flushing...try again 
Gimme a non-negative value: 123fgh 
123fgh is not a valid integer, try again 
Gimme a non-negative value: -12345 
-12345 is negative, try again 
Gimme a non-negative value: 1234 
value is 1234 

그리고 fgets 실패를 테스트하기를, 나는 Ctrl 키 입력 - DEOF을 보내 :

$ ./format2 
Gimme a non-negative value: Input failure, bailing out completely 
value is -1 
+0

멋진 대답도 형제, 돕기 위해 thnx, 호기심 도서관 (y)에 넣을거야! –