[英]fgets inside the while loop
我在使用fgets
遇到问题,因为它在k
输入后第一次进入while
循环时就返回\\n
。 由于我已经进入了while
循环,并且已经#1 try
了#1 try
,因此该如何处理呢?
int main() {
char r;
printf("How to input?\n");
printf("Keyboard ([K])\n File ([F])\n Leave ([E])\n");
scanf("%c", &r);
if (r == 'k' || r == 'K') {
printf("\nKeyboard\n");
opcaoTeclado();
} else {
// stuff
}
}
void opcaoTeclado() {
int try = 0;
char inputline[161];
while (try <= 10) {
printf("\n#%d try\n ", try);
fgets(inputline, 160, stdin);
try++;
}
}
调用scanf()
,输入中会有换行符,第一个调用fgets()
会读取该换行符。 fgets()
遇到换行符\\n
时,将停止读取输入。 因此,它不会读取任何输入。
添加对getchar();
的调用getchar();
在scanf()
立即使用换行符。
或者,如果输入中包含多个字符,也可以使用循环来使用。
int c;
while((c= getchar()) != '\n' && c != EOF);
通常,最好避免将scanf()
与fgets()
混合使用。 您可以使用fgets()
而不是scanf()
并使用不太容易的sscanf()
来解析行。
您应该清理标准输入的缓冲区。 您可以使用fflush(stdin);
在循环之前。 但这是一个不好的风格。 还考虑fseek(stdin,0,SEEK_END);
。
您只需在格式后添加空格即可使用\\n
scanf("%c ", &r);
我在使用fgets时遇到问题,因为它在它第一次在“ k”输入之后进入while循环时返回\\ n。
那是因为对于scanf("%c", &r);
当您输入k[ENTER_KEY]
,字符k
将存储在变量r
而在stdin
流中保留\\n
(按下ENTER键)。
因此对于fgets(inputline, 160, stdin);
,它将在stdin
找到\\n
换行符,在stdin
行中inputline
它,并从man -s3 fgets
退出:
fgets()最多从流中读取小于大小的字符,并将它们存储到s所指向的缓冲区中。 在EOF或换行符之后停止读取。 如果读取换行符,则将其存储到缓冲区中。
由于我已经进入while循环并且已经编写了“#1 try”,因此该如何处理?
您可以使用getchar()
在stdin
使用该\\n
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.