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);
由于我们在这里讨论优先级,值得注意的是 ->
运算符的优先级高于 &
,因此在这种情况下不需要括号。
我正在尝试创建一个程序,该程序使用过程将数字读取为分数类型。那是我的代码(编译器在 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);
由于我们在这里讨论优先级,值得注意的是 ->
运算符的优先级高于 &
,因此在这种情况下不需要括号。