4

我目前正在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或者我应该将它用作字符串并使用数组的第一个字符?还有另一种我什至没有考虑过的更清洁的方法吗?

4

2 回答 2

4

还是应该将它用作字符串并使用数组的第一个字符?

确切地。

char buf[32] = { 0 };

while (buf[0] != 'q') {
    fgets(buf, sizeof(buf), stdin);
    /* do stuff here */
}
于 2013-03-01T21:48:03.330 回答
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。

于 2013-03-01T21:51:33.763 回答