我有一个缓冲区,我假设有10个字符。当我输入9个字符时我注意到它会跳过提示EX。
Enter a p value:
123456789
Enter a q value:
Enter a k value:
但如果我输入8或更少,即使用户输入字母或特殊字符,它也会正常接受,即使用户输入字母或特殊字符。
我的代码:
#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 :(得分:3)
fgets
将读取尽可能多的字符,直到它达到换行符,EOF或缓冲区的大小。它还为字符串终止\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 */ ;
答案 1 :(得分:0)
在fgets
的scanf( “\ n”);
答案 2 :(得分:0)
不是先读取char缓冲区,而是使用scanf(),例如scanf(&#34;%d&#34;,&amp; p)可以替换fgets()和strtol()。
答案 3 :(得分:0)
在使用
调用stdin
之后,将fgets
刷新
int c;
while((c = getchar()) != '\n' && c != EOF);
fgets
等待用户输入数据的原因是因为fgets
知道缓冲区已满(9个字符和\0
的一个空格)并附加了字符串末尾的\0
会将\n
留在下一个stdin
fgets
中
答案 4 :(得分:0)
实际上,当提供给它的size参数小于输入的字符时,fgets会保留\ n字符。在您的情况下,您为fgets提供了10的大小值。
所以当你输入9个字符时,它会用它们填充缓冲区并等待你的输入停止阅读。当你按下输入时,它只是将空字符放在它的末尾,然后将输入转发到下一个提示,从而跳过它。
检查问题https://stackoverflow.com/a/11180652/1386897的答案中的示例。