【问题标题】:Question regarding pointers in fscanf关于 fscanf 中的指针的问题
【发布时间】:2010-11-24 12:25:20
【问题描述】:

我正在使用 C。我在使用 fscanf 函数的指针时遇到问题。当我尝试这样做时:

int *x;
/* ... */
fscanf(file, "%d", x[i]);

我的编译器给我一个警告说“格式参数不是指针”并且代码没有运行(我收到一条消息说“Water.exe 已停止工作”)。如果我将 x 替换为 *x,它就无法编译……这只是语法问题吗?

【问题讨论】:

  • 我怀疑“...”中正在发生一些重要的事情。你能向我们展示你能做到的最小程序的完整版本吗?也就是复制程序,尽量去掉,但还是报错。
  • 另外在那个版本中,请说明你想做什么,周围有太多“不起作用”。
  • *xx[i] 都是int 类型,而不是int * 所期望的fscanf(file, "%d"...) 类型。所以是的,这基本上是一个语法错误。假设你分配了x指向的足够空间,也就是说,在这种情况下你想写fscanf(file, "%d", &x[i])或等效的fscanf(file, "%d", x+i)
  • @RBerteig - 这不是语法错误,因为fscanf() 是一个可变参数函数,所以在编译时没有类型检查。一个好的编译器可以执行编译时类型检查,但不是必须的。

标签: c pointers scanf


【解决方案1】:

如果您想读取单个整数,请执行以下操作:

int x;
fscanf(file, "%d", &x );

如果需要,您可以这样做以读取动态分配变量中的单个整数:

int *x = malloc(sizeof(int));
fscanf(file, "%d", x );

如果你想要一个整数数组,这样做:

int *x = malloc(sizeof(int) * DESIRED_ARRAY_SIZE);
fscanf(file, "%d", &x[i] );

%d 需要一个指向 int 的指针,但 x[i] 是一个 int,因此您需要使用地址运算符(一元 &)获取列表元素的地址。

【讨论】:

  • +1 用于包含一个示例,该示例演示了一个数组元素的地址,在我看来,这似乎是 OP 混乱的根源。
【解决方案2】:

您需要为结果分配一些空间。

int *x; // declares x

x = malloc( 600000 * sizeof(int) ) // and allocates space for it

for (int i = 0; i < 600000; ++i ) {
    fscanf(file, "%d", &x[i] ); // read into ith element of x
}

【讨论】:

  • 你展示的是正确的方法,这不是为了说明 OP 做错了什么: int *x; x = malloc(sizeof(int)); fscanf(文件,“%d”,x);会工作的。
  • 鉴于 OP 正试图将值读入 x[i],我认为他想要一个数组,而不是单个 int
  • @Chris -- 这个问题在我的回答下变了。
  • @Vinko -- 我实际上已经输入了它作为替代,但为了避免混淆而省略了它。
  • @wolfPack88 -- 当您使用 x[i] 时,您实际上是在传递存储在 x[i] 中的值,而不是对它的引用。取消引用它以获得放置值的地址,&x[i].
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 2023-01-08
  • 2014-05-13
  • 2011-12-09
  • 2011-02-01
  • 2020-08-25
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多