我目前正在循环中使用getc()
来接收来自用户的输入:
char x;
while (x != 'q')
{
printf("(c)ontinue or (q)uit?");
x = getc(stdin);
}
如果用户输入c
循环执行,可能是第一次输入一个额外的字符(终结符或可能是换行符,我猜?)作为输入。
我可以通过使用类似的东西来阻止这种情况:
char toss;
char x;
while (x != 'q')
{
printf("(c)ontinue or (q)uit?");
x = getc(stdin);
toss = getc(stdin);
}
但这让我觉得只是一种懒惰的新手处理方式。是否有更简洁的方法使用getc
执行此操作,还是应该将其用作字符串并使用数组的第一个字符?有没有其他更清洁的方式,我甚至没有考虑过?
答案 0 :(得分:4)
或者我应该将它用作字符串并使用数组的第一个字符?
完全。
char buf[32] = { 0 };
while (buf[0] != 'q') {
fgets(buf, sizeof(buf), stdin);
/* do stuff here */
}
答案 1 :(得分:3)
你可以忽略空格:
int x = 0;
while (x != 'q' && x != EOF)
{
printf("(c)ontinue or (q)uit?");
while ((x = getc(stdin)) != EOF && isspace(x)) { /* ignore whitespace */ }
}
另请注意,getc()
会返回int
,而非char
。如果您想要检测EOF
您应该检查以避免无限循环(例如,如果用户在unix系统上按Ctrl-D或在Windows上按Ctrl-Z),这一点很重要。要使用isspace()
,您需要包含ctype.h。