C: 在过程中读取结构分数

C: read struct fraction in procedure

我正在尝试创建一个程序,该程序使用过程将数字读取为分数类型。那是我的代码(编译器在 readFraction() 第 9 行中给我一个错误):

#include <stdio.h>

typedef struct {
  int num,den;
} fraction;

void readFraction(fraction * f) {
  printf("Insert a fraction: ");
  scanf("%d/%d", &*f.num, &*f.den);
}

void writeFraction(fraction f) {
  printf("Fraction inserted: %d/%d\n", f.num, f.den);
}

void main() {
  fraction a;

  readFraction(&a);

  writeFraction(a);
}

这是错误信息:

$ gcc fraction.c 
fraction.c: In function ‘readFraction’:
fraction.c:9:21: error: ‘f’ is a pointer; did you mean to use ‘->’?
    9 |   scanf("%d/%d", &*f.num, &*f.den);
      |                     ^
      |                     ->
fraction.c:9:30: error: ‘f’ is a pointer; did you mean to use ‘->’?
    9 |   scanf("%d/%d", &*f.num, &*f.den);
      |                              ^
      |                    

我知道我可以使用 readFraction(&a.num,&a.den);a=readFraction(); 和函数 returns 分数来解决这个问题,但我想知道我是否可以将分数传递为一个参数。

您的代码的问题在于 C 运算符的相对优先级。结构成员选择的优先级高于解引用运算符,因此子表达式 *f.num 表示“f.num 指向的对象”,而不是“num 指向的对象的成员 num =15=] 点。”前者是错误的,因为 f 是指针,而不是结构或联合。

您可以通过添加括号来覆盖默认优先级:

  scanf("%d/%d", &(*f).num, &(*f).den);

,但使用间接成员选择运算符会更加地道:

  scanf("%d/%d", &f->num, &f->den);

由于我们在这里讨论优先级,值得注意的是 -> 运算符的优先级高于 &,因此在这种情况下不需要括号。