2014-09-24 5 views
1

글자가 10 자라고 가정합니다. 프롬프트 EX를 건너 뛰어도 9 문자를 입력하면 알 수 있습니다.더 많은 문자를 입력하면 메시지가 건너 뜁니다.

Enter a p value: 
123456789 
Enter a q value: 
Enter a k value: 

하지만 8 이하에 넣으면 프로그램이 의도대로, 일반적으로 그것을 받아 들일 것조차 사용자 입력 문자 또는 특수 문자의 경우.

내 코드 : 개행, EOF, 또는 버퍼의 크기 중 하나를 명중 할 때까지이 할 수있는

#include <stdio.h> 
#include <math.h> 
#include <limits.h> 
#include <ctype.h> 
int main() 
{ 
    char pbuffer[10], qbuffer[10], kbuffer[10]; 
    int p=0, q=0, k=0; 
    int r, i, Q, c, count, sum; 
    char a[3]; 
    a[0]='y'; 
    while(a[0]=='y' || a[0]=='Y') 
    { 
     printf("Enter a p value: \n"); 
     fgets(pbuffer, sizeof(pbuffer), stdin); 
     p = strtol(pbuffer, (char **)NULL, 10); 

     printf("Enter a q value: \n"); 
     fgets(qbuffer, sizeof(qbuffer), stdin); 
     q = strtol(qbuffer, (char **)NULL, 10); 

     printf("Enter a k value: \n"); 
     fgets(kbuffer, sizeof(kbuffer), stdin); 
     k = strtol(kbuffer, (char **)NULL, 10); 

     while(p<q+1) 
     { 
     Q=p; 
     sum=0; 
     count=0; 
     while(Q>0) 
     { 
      count++; 
      r = Q%10; 
      sum = sum + pow(r,k); 
      Q = Q/10; 
     } 

     if (p == sum && i>1 && count==k) 
     { 
      printf("%d\n",p); 

     } 
     p++; 
     a[0]='z'; 
     } 
     while((a[0]!='y') && (a[0]!='Y') && (a[0]!='n') && (a[0]!='N')) 
     { 
     printf("Would you like to run again? (y/n) "); 
     fgets(a, sizeof(a), stdin); 
     } 
    } 
    return 0; 
} 
+0

[scanf ("% d", \ [... \])가 '\ n'을 사용하지 않는 이유는 무엇입니까? scanf ("% c")는 어떻게합니까?] (http://stackoverflow.com/questions/13275417/why-scanfd-does-not-consume-n-while-scanfc-does) –

답변

3

fgets가 많은 문자를 읽어 것입니다. 또한 문자열 끝에 +1 문자 인 \0을 저장합니다. 따라서 123456789\n을 입력하고 10 자 버퍼가있는 경우 fgets은 해당 버퍼에 9 자만 들어갈 수 있음을 알고 있기 때문에 처음 9자를 읽고 NULL을 추가하여 버퍼에 123456789\0을 부여하고 \n은 여전히 ​​있습니다. STDIN. 그런 다음 fgets 번으로 전화하십시오. STDIN에 이미 \n이 있으므로 입력을 기다리지 않습니다. 따라서 \n까지 읽습니다.이 문자는 한 문자 일뿐입니다. 그래서 두 번째 버퍼는 이제 \n\0이고 STDIN은 비어 있습니다.

입력 할 문자열을 저장할 버퍼를 크게 만들거나 fgets마다 STDIN을 플러시하십시오. 가능성이 뭔가 같은 :

while((c = getchar()) != '\n' && c != EOF) 
/* Ignore the character */    ; 
+0

STDIN 버퍼 지우기.나는 여러 가지 방법을 시도해 왔으며 작업을 본 유일한 방법은 fflush (stdin)이지만 사용하는 것은 나쁘다. –

+0

달콤한 일했습니다!. 지금은 8 자 이하의 문자를 입력하면 관련성이없는 입력을 기다리는 다음 줄로 이동하게되고 적절한 입력을 요구합니다. 9 + 문자가 제대로 작동하는 것을 제외하고는. –

+0

@AndrewRicci 아, 맞아. 나는 그걸 몰랐어. 당신이 할 수있는 일은'pbuffer'에'\ n'이 있는지 확인하고 위의 while 루프 만 실행하면됩니다. – Dan

0

fgets

는 scanf ("\ n")를 한 후이 줄을 추가;

+0

@CoolGuy 너 나있어! 나는 오타를 만들었습니다 :) 미안 해요! –

0

먼저 char 버퍼로 읽는 대신 scanf()를 사용할 수 있습니다. scanf ("% d", & p)는 fgets()와 strtol()을 대체 할 수 있습니다.

+0

나는 사용자가 글자를 입력하거나 너무 큰 입력을 입력 할 때 fgets를 사용한다. –

0

플러시 사용자가 (fgets 버퍼가 가득 것을 알고 있기 때문에 데이터가 9 개 문자와 하나 개의 공백을 입력 할 이유 fgets 기다릴 나던

int c; 
while((c = getchar()) != '\n' && c != EOF); 

이유를 사용 fgets에 대한 호출에 후 stdin\0 용) 및 문자열의 끝에서 \0을 추가하고 다음 fgets

0

실제로는 fgets로 촬영 한 stdin\n 잎은 \ n 개의 문자를 유지하면 크기 AR 제공된 문안은 입력 된 문자보다 작습니다. 당신의 경우에는 fgets에 10이라는 값을 제공했습니다.

9자를 입력하면 버퍼가 채워지고 읽는 것을 멈추기 위해 입력을 기다립니다. 그리고 Enter 키를 누르면, 끝 부분에 null 문자가 놓이고 Enter 키를 다음 프롬프트로 돌리므로 건너 뛰게됩니다.

질문에 대한 대답의 예를 확인하십시오. https://stackoverflow.com/a/11180652/1386897.

관련 문제