【问题标题】:c - Trouble with scanfc - scanf 的问题
【发布时间】:2018-02-15 05:40:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: c scanf delimiter


    【解决方案1】:

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

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

    但前面的那个丢弃了它看到的每一个字符,它并没有停止并消耗你的 int 的数字。

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

    示例用法:

    >54321 12
    

    它将分别接收firstlast 112。并在此处检查 scanf 的返回值 - 如果调用成功,它将是 2。扩展您将执行此操作的想法

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

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

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

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

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

    在所有这些情况下都必须检查 scanf 的返回值 - 需要该级别的错误检查。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 2011-07-21
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多