繁体   English   中英

为什么我们不能使用scanf直接初始化struct中的变量?

[英]Why can't we directly initialise a variable in struct using scanf?

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

我想知道这是否与使用 &(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。

scanf 返回扫描的项目数。 在这种情况下,根据您描述特定输入的方式,它始终为 1。这就是 1 的来源。

您可以从表达式初始化成员。 表达式是一些计算结果的代码。 调用函数的一小段代码评估函数调用返回的内容。

scanf不会返回您想要的值,而是返回成功解析的参数数量的计数(阅读文档!) 那不是您想要使用的。 然后,您尝试在scanf的“输出参数”槽中命名该成员,但这不起作用,因为 (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);
}

现场演示

请注意,我还更正了您的标头包含,删除了初始化程序中的分配(奇怪;出于神秘的原因工作,但不要这样做),对您的类定义进行 de-C-ised,并using namespace std删除,因为我们没有像那样。

...或坚持您在评论中的工作解决方案(尽管这排除了将p1声明为const !)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM