分享
为什么问答平台  ›  专栏  ›  技术社区  ›  y.han

为什么不能使用scanf直接初始化结构中的变量? - Why can't we directly initialise a variable in struct using scanf?

  •  -2
  • y.han  · 技术社区  · 6 月前

    我尝试使用scanf来直接读取输入值,而不是在结构中用数值0初始化变量。它不起作用,但我不明白为什么?

    我想知道这是否与使用&(p1.first)无效的事实有关,因为内存空间尚未分配?如果是这样,在初始化后(如下面的注释代码中)重写scanf语句是否是更新结构变量值的唯一方法?

    #include <iostream>
    
    using namespace std;
    
    typedef struct {
      int first;
      int second;
    } score;
    
    int main() {
      score p1 = {
        p1.first = scanf("%d", &(p1.first)),
        p1.second = 0,
      };
    
      /* I know the following works:
      score p1 = {
        p1.first = 0,
      };
      scanf("%d", &(p1.first));
      */
    
      printf("%d", p1.first);
    }
    

    当输入为2时,我期望也得到2,但无论我尝试的输入值是多少,printf都会打印1。

    2 回复  |  直到 6 月前
        1
  •  2
  •   user4581301    6 月前

    可以从初始化成员 表达 . 表达式是一段计算结果为某个值的代码。对函数的调用的代码位计算函数调用返回的值。

    scanf 不返回所需的值,而是成功分析的参数数的计数 (阅读) the documentation !) . 这不是你想用的。然后您尝试将成员命名为 斯坎夫 's“out-parameter”槽,但这不起作用,因为(a)对象尚不存在,(b)您正准备从另一个值初始化成员,因为(c)out参数对表达式的计算结果没有影响。

    简而言之,这行不通。您可以将调用包装到一个特定的新函数中,该函数会返回您需要的内容:

    #include <cstdio>
    
    struct score {
      int first;
      int second;
    };
    
    int ReadANumber()
    {
       int number;
    
       const int r = std::scanf("%d", &number);
       if (r > 0 && r != EOF)
         return number;
    
       // some fallback, or you could throw an exception!
       return -1;
    }
    
    int main() {
      score p1 = { ReadANumber(), 0 };
      printf("%d", p1.first);
    }
    

    ( live demo )

    请注意,我还更正了您的头include,删除了初始值设定项中的赋值(奇怪;出于神秘原因工作,但不要这样做),取消了您的类定义,并删除了 using namespace std 因为我们不喜欢那样。

    …或者坚持你在评论中的工作方案(尽管这不包括声明 p1 作为 const !).

        2
  •  4
  •   nicomp    6 月前

    scanf返回扫描的项目数。在本例中,按照您描述特定输入的方式,它始终是1。这就是1的来源。