1

所以我为我的班级分配了一个作业,其中应该有一个结构、两个功能和一个主要功能。结构需要有这 3 个变量,函数需要有这些名称,而 main 只能有这 3 行。这是我的第一个 C 程序,我们一整年都在做 c++,所以我有点迷茫。我编写了程序并编译了它,但是在我输入值之后,输出等于一个基本上是随机的值。

//Joshua    
#include <stdio.h>

struct Person
{
    char name[100];
    int age;
    float gpa;
};

void fill_person(struct Person* per)
{
    char name[100];
    printf("Enter a name.\n");
    fgets(name, 100, stdin);
    per->name = name;

    int age;
    printf("Enter an age. \n");
    scanf("%d", &age);
    per->age = age;

    float gpa;
    printf("Enter a GPA. \n");
    scanf("%f", &gpa);
    per->gpa = gpa;

}

void show_person(struct Person* per)
{
    char name[100];
    printf("The person's name is %c\n", &name);

    int age;
    printf("Their age is %d\n", &age);

    int gpa;
    printf("Their GPA is %f", &gpa);
}

int main()
{
    struct Person per;
    fill_person(&per);
    show_person(&per);
}
4

6 回答 6

1

这更好,你不需要使用那些局部变量,你可以直接读入你的结构:

void fill_person(struct Person* per)
{
  printf("Enter a name.\n");
  fgets(per->name, 100, stdin);

  printf("Enter an age. \n");
  scanf("%d" ,&per->age);

  printf("Enter a GPA. \n");
  scanf("%f",&per->gpa);
}

检查汤米的答案以了解您的其他功能的问题。

于 2013-10-22T03:37:30.703 回答
1

检查你的printf语句show_person——在他们在每个字符串之后传递错误类型的变量时,他们传递的值与struct你传递的值无关。

你周围的东西fgets也不会像你期望的那样工作。例如char string1[100], string2[100]; string2 = string1;,不会将 string1 的内容复制到字符串 2。

于 2013-10-22T03:30:43.647 回答
1

这是因为您没有使用传递 show_person 函数的“per”变量。您基本上是在该函数中创建新变量,然后显示它们。您需要使用 per-> 并删除函数中变量的声明。

于 2013-10-22T03:33:04.843 回答
1

您正在打印的name和其他变量是未初始化的局部变量。您想从 Person 对象打印名称。

于 2013-10-22T03:34:08.567 回答
1

tl; dr“输出等于一个基本上是随机的值”,因为

  1. printf使用不当;和
  2. per->name = name是不正确的。

定影印刷

使用/ /etc&someVariable时有意义,因为这些函数必须修改变量(在 C 中,这是通过将指针传递给所述变量来完成的);但是,在使用 时不应传递指向变量的指针:只需传递值!scanffgetsprintf

此外,使用已读取的数据(此处可通过提供的per参数获得)。使用新的本地未分配变量(即使没有&someVariable)将导致不可预测的输出。

void show_person(struct Person* per)
{
    // Also note use of %s, not %c - refer to the printf documentation.
    printf("The person's name is %s\n", per->name);
    printf("Their age is %d\n", per->age);
    // ..

固定读数

现在,还有另一个关键缺陷fill_person(它甚至可以编译吗?)。这是因为人们不会在 C 中“复制”字符串,x = y因为它只是分配一个值,可能是一个字符指针。要么使用strcpy,要么fgets直接进入per->name字符数组。

void fill_person(struct Person* per)
{
    printf("Enter a name.\n");
    fgets(per->name, 100, stdin);
    // While the following intermediate variables could also be eliminated
    // using them won't affect the semantics of the code.
    // ..

我希望上面的示例存根和注释能让您顺利上路!

于 2013-10-22T04:01:53.863 回答
0

因为C中的struct没有像C++/java中的“protected”或“private”和c++中的指针*this,所以你可以在函数中更改struct中成员的值。我认为你应该像下面的代码一样编写函数 show_person:

void show_person(struct Person* per)
{
printf("The person's name is %c\n",per.name );

int age;
printf("Their age is %d\n",per.age);

int gpa;
printf("Their GPA is %f", per.gpa);
}

当你使用 &variable 时,它​​表示变量在内存中的地址,而不是它的值。你应该这样写你的功能

printf("The person's name is %c\n",name );

于 2013-10-22T03:33:05.630 回答