【问题标题】:Why scanf doesn't work with spaces at the end of formal input?为什么 scanf 不能在正式输入末尾使用空格?
【发布时间】:2019-11-10 12:25:51
【问题描述】:

我正在尝试这个:

    int M,N,K;
    printf("Enter (m,k,n) : ");
    scanf("%d %d %d ", &M, &K, &N);
    printf("\nDone?");

这是在 main 函数内部。我需要程序来读取三个整数,但是当我运行它时,它只读取三个但不超过 scanf,即“完成?”没有被执行,就好像它还在等待更多的输入。如果我在最后一个 %d 之后删除空间,它工作正常。但是为什么会这样呢?

【问题讨论】:

  • 相关:请勿在可能格式不正确的(人为)输入上使用scanf()特别是不检查返回值——MKN 可能在您的scanf() 之后未初始化,您甚至都不知道。通常,最好读取完整的输入行 (fgets()),然后在内存中解析它们。这样你就可以回到输入行;获得更好的错误处理,例如strtol()strtod()strtok();并为有意义的错误消息提供完整的输入行。

标签: c scanf


【解决方案1】:

如果我在最后一个 %d 之后删除空格,它可以正常工作。但是为什么会这样呢?

" " in "%d %d %d " 指示 scanf() 读取而不是保存任意数量的空格,包括 '\n'

scanf() 不断消耗空白直到遇到一些非空白。 @user3121023

"%d %d %d " 要求 scanf() 在读取 3 个数字之后 之后不返回。


提示:避免使用scanf()。使用fgets() 然后解析字符串@DevSolar

【讨论】:

【解决方案2】:

这是在多个变量中获取用户输入的方法:

int M,N,K;
printf("Enter (m,k,n) : ");
scanf("%d", &M);
scanf("%d", &N);
scanf("%d", &K);
printf("\nDone?");

【讨论】:

    【解决方案3】:

    尝试分别读取这些值。我不认为 scanf 打算以这种方式使用。 另外,您期望在 scanf 字符串的末尾放置一个空格是什么? 试试这个:

    scanf("%d", &M);
    scanf("%d", &K);
    scanf("%d", &N);
    

    编辑:我检查过了,是的,你可以这样做。 但是你为什么要这样做呢?如果用户输入不正确,例如空格或非预期字符,将更难验证。 如果您希望所有内容都在单个文本行中,您可以使用 fgets() 将其读取为完整字符串,并使用 strtok() 对其进行标记。 或者只是如图所示单独读取值。

    好吧,只是我的看法。如果我错了,请有人澄清我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多