我试图打印结构的int变量的值,但它打印出地址而不是..不知道原因,这里是代码:
struct data{ char name[20]; int age[100]; }; typedef struct data dataobj; int main() { dataobj element; printf("enter a name:\n"); gets(element.name); printf("name is: %s\n",element.name); printf("enter a number:\n"); scanf("%d",&element.age); printf("number is: %d",element.age); return 0; }
输出:
enter a name: John name is: John enter a number: 30 number is: 6356352 Process returned 0 (0x0) execution time : 7.278 s Press any key to continue.
你可以看到它没有按照我的意愿打印30,而是打印6356352(应该是element.age var的地址)
答案 0 :(得分:2)
不要使用gets
,在C99中已弃用并从C11中删除
相反,请使用fgets
:
char *ptr;
fgets(element.name, sizeof element.name, stdin);
/* Remove the trailing newline */
ptr = strchr(element.name, '\n');
if (ptr != NULL) {
*ptr = '\0';
}
age
不是int
,而是int
s的数组:
struct data{
char name[20];
int age[100];
};
变化
scanf("%d",&element.age);
printf("number is: %d",element.age);
到
scanf("%d",&(element.age[0]));
printf("number is: %d",element.age[0]);
为了读入年龄的第一个元素(坐在索引0处),或者只是使用普通的int
而不是数组
答案 1 :(得分:2)
我认为你的意思是将age
属性作为100 int
s的数组;如果您不将struct
定义更改为只有一个int
:
struct data{
char name[20];
int age;
};
您提供的代码工作得很好。如果您希望绑定年龄值,则不希望使用数组。使用这样的数组意味着每个dataobj
由一个名称和100个年龄段描述。相反,请考虑添加运行时检查,例如:
if (element.age < 0 || element.age > 99) {
printf("Bad age value\n");
}
答案 2 :(得分:0)
考虑这个陈述。
scanf("%d",&element.age);
这里,age是数组大小为100的整数元素。所以在你的记忆中创建了一系列100个整数,并且起始元素的地址存储在其他指针变量中(在你的案例年龄中)。因此,当您扫描值时,您试图操纵数组的基址,这是不可能的。这属于逻辑错误,只能通过理解来追踪。所以,请记住一件事。
int age[100]
这是一个声明,其中编译器创建一个指针和100个整数变量(连续)。并且第一个变量的地址存储在指针中,该指针赋予数组名称。
因此,当您尝试打印时,它会打印基地址数组年龄[100]。
答案 3 :(得分:0)
我认为你要做的就是把年龄存放到年龄阵列的第一个元素中:
scanf("%d", element.age);
printf("Age is %d\n", element.age[0]);
基本上,99个元素将被闲置。另一种方法是增加包含年龄的年龄数组中的值。换句话说,如果用户进入30岁,那么你基本上会做一个element.age [29] ++;
通过这种方式,您可以将所有100个值保持为零,除了您想要提升的年龄(用户输入的年龄)
另一个可能是良好实践的方法是在使用scanf时使用单独的变量。例如,此代码片段:
int incoming_age;
scanf("%d", &incoming_age);
element.age[0] = incoming_age;
将输入扫描到incoming_age变量后,您可以使用它执行各种操作。它可以使代码更具可读性。