【问题标题】:why scanf doesn't read zero为什么 scanf 读不为零
【发布时间】:2020-05-27 05:58:24
【问题描述】:

我真的是新手。我使用 scanf 从输入中读取并将其分配给变量。当我 printf 变量时,它会打印 1 而不是零。这是我的代码:

#include <stdio.h>

int main()
{
   int a = scanf("%d", &a);
   printf("%d", a);

   return 0;
} 

【问题讨论】:

    标签: c printf scanf


    【解决方案1】:

    scanf 成功返回 1:

    int a = scanf("%d", &a);
    

    将其更改为:

    int a;
    scanf("%d", &a);
    

    【讨论】:

    • 这很明显,但通常应该使用if(scanf... 来避免未初始化的变量。 stackoverflow.com/questions/27104910/…
    • 绝对!我只是在回答 OP 关于为什么“a”中有 1 的问题。
    • 谢谢,它有效。我正在学习 c 编程并做代码强制问题我决定学习 c 因为它在竞争性编程中更快
    【解决方案2】:

    int a = scanf("%d", &amp;a); 定义ascanf 的返回值进行初始化,并要求scanf 将转换后的值放入a。这是错误的。使用:

    int a;
    scanf("%d", &a);
    

    scanf 返回分配的项目数或EOF,如果在第一次匹配完成之前发生输入失败。您可以使用它来测试输入是否已成功处理。

    【讨论】:

      【解决方案3】:

      你应该使用类似的东西:

      #include <stdio.h>
      
      int main(void)
      {
          int a;
          int n = scanf("%d", &a);
          if (n != 1)
          {
              fprintf(stderr, "Failed to read an integer (%d)\n", n);
              return 1;
          }
          printf("%d\n", a);
      
          return 0;
      }
      

      变量n 允许您区分EOF(通常为-1)和“空格后的第一个数据不是整数的一部分”(n 将包含0)。 请注意,错误消息打印在标准错误上;这就是它的用途。您通常应该在输出消息的末尾打印一个换行符。

      您可以决定不使用n,然后不在错误消息中打印它:

      #include <stdio.h>
      
      int main(void)
      {
          int a;
          if (scanf("%d", &a) != 1)
          {
              fprintf(stderr, "Failed to read an integer\n");
              return 1;
          }
          printf("%d\n", a);
      
          return 0;
      }
      

      测试来自scanf() 的结果仍然很重要,这样如果用户输入zero 而不是0,您就可以发现问题。

      请注意,如果匹配失败,则不会分配 a — 因此,如果没有测试,您将打印一个未初始化的变量,这不是一个好主意。您可以定义 int a = 0; 来避免该问题(您可以选择任何您喜欢的 int 初始化程序)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-02
        • 2012-10-27
        • 1970-01-01
        • 2012-06-03
        • 1970-01-01
        • 2021-05-09
        • 1970-01-01
        相关资源
        最近更新 更多