1

我使用 fgets() 获取用户输入,然后使用 sscanf() 将其解析为双精度。这是我的示例代码:

int menuItem = 0;
char input[3];
printf("Enter valid menu item"); //values are 1, 2, 3, 4, 5, and -1
fgets(input, sizeof input, stdin);
sscanf(input, "%d", &menuItem);

如果用户输入 3 位数字(无效输入,我想相应地处理它),则会发生错误,它会通过自动将第三位数字作为下一个输入来跳过我的下一个 fgets()。例如,如果用户 inters 123,它现在将跳过下一个 fgets 并使用值 3 作为输入。我怎样才能清除这个,或者最多只能读取 1 位数字(但仍然能够处理 -1)。

4

2 回答 2

3

你为什么不让你的输入数组更大呢?就像 50 个字节...如果用户输入那么多,他们就是白痴,应该有奇怪的行为 =)

这当然是不优雅的,但从长远来看,你可能没有在这里编写工业强度的代码。您只想修复一个愚蠢的错误,这是最简单的解决方案。

[编辑]

如果你对我为什么建议这个感到困惑。您的输入数组仅足以容纳 2 个值,外加一个空终止符。很明显,您希望它足够大,以确保用户输入一个选项而不是两个选项

于 2012-09-09T23:30:15.020 回答
2

您的输入缓冲区允许 1 个数字、1 个换行符和 1 个终端 null '\0',这确实不够大。

假设用户类型100后跟换行符。第一次调用fgets()将读取 2 个数字 ( 10),然后第二个调用将读取第三个数字和换行符;然后下一个调用将等待下一个输入。

只需将缓冲区大小增加到更合理的值。对于我编写的许多程序,我使用 4096 的缓冲区大小。POSIX 标准将 _POSIX2_LINE_MAX 设置为 2048。如果您对此不满意,只需使用方便的数字,例如 64 或 128;你不会错得太远。

你的技术fgets()sscanf()绝对是更好的方向,但你应该检查是否sscanf()解析了正确数量的值。fgets()plus的优点之一sscanf()是您可以更好地报告用户输入的行中的错误;fscanf()如果您使用或scanf()直接使用,这将不那么容易做到。

于 2012-09-10T00:05:46.013 回答