【问题标题】:How to properly use struct inside for loop?如何在for循环中正确使用struct?
【发布时间】:2021-02-04 15:13:12
【问题描述】:

任务:我们需要使用循环创建 7 个名为 parent[1-7] 的结构对象。然后让用户输入他们的姓名、年龄、孩子的名字。之后 1) 打印具有最大家庭的父母的姓名。 2)为最短名字的父母打印最长的孩子名字(与其他人相比)我知道,听起来已经很混乱了。并且 3) 打印出父母的所有给定信息(姓名、年龄、孩子姓名/姓名),这些信息大于 7 位父母的平均年龄。

问题:我遇到了一个问题,我什至无法为程序设置此权限以扫描用户输入。我添加了一个新的struct 对象和scanf 供用户插入他有多少个孩子,以便以后更方便地访问,但是当我输入该数字(例如 2 或 3 个孩子)时它会一直崩溃。老实说,我不知道如何完成这项任务的其他部分。

这就是目前程序的样子(我在大学的第一年,所以我希望我犯了一些错误):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int max=3;
int j=0;


struct parents
{
    char name[30];
    int age;
    int kid_count;
    char kid_name[30];
};

int main()
{
  for(j=0; j<max; j++)
  {
    struct parents parent[7];
    parent[j].name;
    parent[j].age;
    parent[j].kid_count;
    parent[j].kid_name;


    printf("Parent %d Enter parent name \n",j+1);
    scanf(" %s", &parent[j].name);


    printf("Parent %d Enter parent age \n",j+1);
    scanf(" %d", &parent[j].age);


    printf("Parent %d Enter how many kids he has \n",j+1);
    scanf(" %d", &parent[j].kid_count);


    printf("Parent %d child name \n",j+1);
    scanf(" %s", &parent[j].kid_name);
  }

  return 0;
}

【问题讨论】:

  • 读取字符串时去掉&amp;。编译器也应该警告过你。
  • 改成定长数组struct parents parent[j]; => struct parents parent[7];。您在每次迭代中创建一个 j 大小的可变长度数组。您无法访问 j 大小的数组中的元素 [j]j-1 是最后一个元素。
  • struct parents parent[j]; - 这行应该做什么?它是长度为j 的数组parent定义。很确定你想在循环之外定义它。

标签: arrays c loops for-loop struct


【解决方案1】:
for(j=0; j<max; j++)
{
    struct parents parent[7];

您在这里声明了一个包含 7 个结构的数组,每次都通过循环。因为它是在循环体范围内的堆栈上声明的,所以该数组也将在每次循环中消失。但是您在每次迭代中只使用其中一种结构,即索引 j 处的结构。

您可能的意思是在循环范围之外声明数组,以便在循环完成后它仍然存在。

    parent[j].name;
    parent[j].age;
    parent[j].kid_count;
    parent[j].kid_name;

这些行似乎没有做任何事情。您的意思是在这里为每个字段分配一个值吗?接下来您要做的是使用scanf() 将值写入这些字段,因此您可能在此处设置的任何值都将被覆盖。最好只删除这些行。

 return 0;
}

一旦循环完成,就不会发生其他任何事情。即使您将 parent 结构的数组移到循环之外,此时它也会超出范围而无需对其进行任何处理。要使该数组有用,您需要使用它。也许你还没有到那部分?

【讨论】:

  • 你能告诉我关于最后一部分的更多信息吗?我如何实际存储这些变量,所以一旦循环完成我就不会丢失它们?对不起,愚蠢的问题。
  • @mediocrevegetable1 确实,出于测试目的进行了调整并将最大值更改为 3,以减少编写所有字符的时间。现在我在循环之前移动了结构并面临其他问题:现在我需要比较名称长度并在循环之后打印出具有最长和最短名称的父级,但不知道该怎么做
  • @RichardTheProgrammingNewb 如果您将parent 结构体的数组移到循环之外,那么当循环结束时它仍然可以使用。如果你把它留在循环中,那么不仅循环结束时它不可用,而且整个数组也将被销毁并重新创建每次循环。通常,在一组大括号 ({...}) 内声明的变量在右大括号之后消失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2012-12-29
  • 2020-04-29
相关资源
最近更新 更多