c - scanf 问题

c - Trouble with scanf

所以我在格式化我的 scanf 调用以适应我的输入时遇到了一些问题。基本上,我想输入一个字符串(最多 32 个字符)和 2 个整数(全部用空格分隔)。目前,我的代码是:

scanf("%32s", str);
scanf("%*s %d %d", &first, &last);

我添加了 %*s 以忽略我正在读入的 32 之后的任何可能字符。出于某种原因,此 %*s 忽略第一个数字并将输入中的第二个数字读入 &last。我不确定具体如何解决此问题,如有任何帮助,我们将不胜感激。

如果你想丢弃一定数量的字符(我的回答是 4 个),你可以这样做:

scanf("%*4s %d %d", &first, &last);

但是较早的一个正在丢弃它看到的每个字符并且它没有停止并消耗了您的 int 的数字。

在这种情况下,我显示的内容将消耗 4 个字符,然后读取 int-s。

用法示例:

>54321 12

它将分别接受 firstlast 112。并在此处检查 scanf 的 return 值 - 如果调用成功,它将是 2。扩展你会做的想法

scanf("%*32[^ \n] %d %d", &first, &last);

在这里你将跳过前 32 个字符,如果它们不是来自扫描集 [^ \n],然后其余的内容使用 %d 格式说明符输入以获得输入整数。

如果您想跳过第一个 space 之前的任何字符,那么您可以这样做

scanf("%*[^ \n] %d %d", &first, &last);

这与前面的完全一样,唯一的区别是这里没有像以前那样限制 32 个字符。

在所有这些情况下,必须检查 scanf 的 return 值 - 需要那个级别的错误检查。

最好是使用 fgets 来更好地控制输入。取整行然后使用 strtol

解析它

我将按原样添加评论 (Jonathan Leffler):

注意 %*4s 将跳过零个或多个白色 space 字符,然后读取最多 4 个非白色 space 字符,并在下一个停止白色 space 或当 4 个字符已被读取时。下面的空格跳过零个或多个白色 space。 %d 也会跳过零个或多个白色 space 字符,然后读取一个整数(或失败)。 (重复第二个空格和 %d。)如果你想无条件地跳过 4 个字符,使用 %*4c,可能在 % 之前有一个空格,因为 %c 不跳过白色 space。 (" %*4c").

David C. Rankin 提到的另一种选择是使用其中数字被忽略的扫描集。 scanf("%*[^0-9]%d %d",&first,&last) 将跳过所有字符,直到找到一个数字。