说我有以下代码
type ProcessInfo struct {
PID string `json:"PID"`
PPID string `json:"PPID"`
PGID string `json:"PGID"`
WINPID string `json:"WINPID"`
TTY string `json:"TTY"`
UID string `json:"UID"`
STIME string `json:"STIME"`
COMMAND string `json:"COMMAND"`
}
我在这里尝试测试的是当我输入4个以上的字符时清除缓冲区。只要我的名字是4个字符或更多,它就可以正常工作,但是当我达到3个字符或更少时,问题就变成了while循环。它期望来自stdin缓冲区的getchar(),但这是空的。有什么方法可以解决这个问题?
答案 0 :(得分:1)
您需要检查name
是否包含换行符。如果是,缓冲区中没有任何内容,您不需要刷新它。
fgets(name, 5, stdin);
printf("Name: %s\n", name);
if (strchr(name, '\n') == NULL) {
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
答案 1 :(得分:1)
我们已经在Compatibility Documentation from SAP Development Tools的评论中对此进行了讨论。如果缓冲区中有空间,fgets()
将使用终止换行符,将其放入缓冲区。您可以通过在缓冲区中查找换行符来确定它是否已完成此操作。如果你找到一个,那么
您可能希望删除它 - 例如将其替换为'\0'
。
您应该避免尝试排空输入行的尾部,因为流已经前进到下一行。
答案 2 :(得分:0)
检查fgets()
的结果。除非代码这样做,否则使用name
的内容可能是未定义的行为。避免使用幻数:使用sizeof name
。
// fgets(name, 5, stdin);
if (fgets(name, sizeof name, stdin) == NULL) Handle_EOF();
在'\n'
中寻找潜力 name[]
。
char *eol = strchr(name, '\n');
如果找到一个,则使用空字符覆盖,否则消耗该行的其余部分
if (eol) {
*eol = '\0';
} else {
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
}
打印name[]
printf("Name: %s\n", name);