【发布时间】:2020-03-26 07:31:51
【问题描述】:
我想要一个 scanf 函数,它允许用户输入最多四个由空格分隔的整数,但如果只输入 2 个整数,它仍然运行。
scanf("%d %d %d %d", &command, &num_one, &num_two, &num_three);
【问题讨论】:
标签: c
我想要一个 scanf 函数,它允许用户输入最多四个由空格分隔的整数,但如果只输入 2 个整数,它仍然运行。
scanf("%d %d %d %d", &command, &num_one, &num_two, &num_three);
【问题讨论】:
标签: c
scanf 正是这样做的。它返回它执行的成功转换的数量。如果它无法执行转换(或无法匹配文字字符),它将在该点精确停止读取。
您应该始终检查它的返回值,即使您复制的示例没有这样做。
scanf 不保证转换后的值用空格分隔。它们可能由换行符分隔。如果你想要一个换行符来停止扫描,你需要使用类似fgets(或者,如果可能的话,最好是Posix getline函数)来读取该行,然后在读取的行上调用sscanf .
您还可以强制scanf 在行尾停止,方法是使用%*[ \t] 而不是 分隔%ds,这将只匹配空格和制表符。 (* 导致scanf 不尝试保存匹配的字符串,并且也不将转换计入其返回计数中。)但这会让您遇到scanf 的另一个问题:如果有垃圾行,您通常希望从下一行继续阅读。 getline/sscanf 解决方案将为您做到这一点。如果您使用scanf,则需要手动刷新输入行的其余部分,这需要调用fgets 或getline。
当我在这里时,请注意scanf("%d %d %d %d", ...) 和scanf("%d%d%d%d", ...) 之间没有区别,因为%d 与除%c、%[ 和%% 之外的所有scanf 转换一样,会跳过前导空格。
【讨论】: