#include <stdio.h>
int main()
{
char n='Y';
fflush(stdin);
while(n=='Y')
{
printf("Add Next Y/N: ");
n=getc(stdin);
}
printf("n = %c",n);
}
此循环在第一次迭代后结束而不从键盘输入。
答案 0 :(得分:3)
fflush
与输出流相关联。不要在stdin
上调用它。
这是因为在输入Y
之后,输入流中仍然会留下换行符,该换行符将作为getc
的下一个输入传递。所以现在,循环的条件现在失败并且循环出来。
只需在getc()之后添加getchar()
即可使用换行符。
请注意,getchar()
与getc(stdin,ch)
相同。
#include <stdio.h>
int main()
{
char n='Y';
while(n=='Y')
{
printf("Add Next Y/N: ");
n=getc(stdin);
getchar();
}
printf("n = %c",n);
}
答案 1 :(得分:2)
在我的系统上,getc()似乎没有返回,直到我点击返回键。这意味着'Y'后面跟着'\ n'。所以为了保持循环,我不得不为while添加一个条件:
#include <stdio.h>
#include <ctype.h>
int main()
{
char n = 'Y';
while ( toupper(n) == 'Y' || n == '\n' )
{
if ( n != '\n' )
{
printf("Add Next Y/N: ");
}
n = getc(stdin);
}
}
fgets()似乎效果更好:
#include <stdio.h>
#include <ctype.h>
int main()
{
char input[100] = { "Y" };
while ( toupper(input[0]) == 'Y' )
{
printf("Add Next Y/N: ");
fgets(input,sizeof(input),stdin);
}
}
编辑以下评论: scanf()也有回车问题。最好是fgets()然后是sscanf()。因为你正在做额外的getchar()我认为你可以摆脱'\ n'的检查。试试这个:
#include <stdio.h>
#include <ctype.h>
struct item {
char name[100];
int avg;
double cost;
};
int main()
{
FILE *fp = fopen("getc.txt","w");
struct item e;
char line[200];
char next = 'Y';
while(toupper(next) == 'Y')
{
printf("Model name, Average, Price: ");
fgets(line,sizeof(line),stdin);
sscanf(line,"%s %d %f",e.name,&e.avg,&e.cost);
fwrite(&e,sizeof(e),1,fp);
printf("Add Next (Y/N): ");
next = getc(stdin);
getchar(); // to get rid of the carriage return
}
fclose(fp);
}
没有sscanf()的替代方法:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct item {
char name[100];
int avg;
double cost;
};
int main()
{
struct item e;
char line[200];
char next = 'Y';
while(toupper(next) == 'Y')
{
printf("Model name ");
fgets(line,sizeof(line),stdin);
line[ strlen(line) - 1 ] = '\0'; // get rid of '\n'
strcpy(e.name,line);
printf("\nAverage ");
fgets(line,sizeof(line),stdin);
e.avg = atoi(line);
printf("\nPrice ");
fgets(line,sizeof(line),stdin);
e.cost = atof(line);
printf("you input %s %d %f\n",e.name,e.avg,e.cost);
printf("Add Next (Y/N): ");
next = getc(stdin);
getchar(); // get rid of carriage return
}
}
答案 2 :(得分:1)
问题在于,当您从用户那里获得输入(键盘中的标准输入)时,您不仅仅获得Y
字符,而是获得两个字符:Y\n
。
您必须使用\n
或存储char数组并从输入中删除它,或者沿着这些行删除它。这里有一个快速的一行修复,并没有真正改变你的代码:
n=getc(stdin);
getchar(); //consume the newline