getc(stdin)返回两个字符。有没有更好的方法来处理这个?

时间:2013-03-01 21:45:02

标签: c

我目前正在循环中使用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执行此操作,还是应该将其用作字符串并使用数组的第一个字符?有没有其他更清洁的方式,我甚至没有考虑过?

2 个答案:

答案 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。