#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);
}
此循环在第一次迭代后结束,无需从键盘输入。
fflush
与输出流相关联。不要叫它stdin
。
那是因为在您输入之后Y
,输入流中仍然有一个换行符,该换行符作为下一个输入传递给getc
. 所以现在,循环的条件现在失败并退出循环。
只需getchar()
在 getc() 之后添加 a 即可使用换行符。
请注意,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);
}
在我的系统上,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
}
}
问题是,当您从用户(来自键盘的标准输入)获得输入时,您获得的不仅仅是一个Y
字符,而是两个字符:Y\n
.
您必须使用\n
或存储一个 char 数组并将其从您的输入中删除,或者类似的东西。这是一个快速的单行修复程序,它不会真正改变您的代码:
n=getc(stdin);
getchar(); //consume the newline