在结构中,scanf返回var地址而不是值

时间:2016-06-20 18:27:36

标签: c struct scanf

我试图打印结构的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的地址)

4 个答案:

答案 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变量后,您可以使用它执行各种操作。它可以使代码更具可读性。