能帮我看看47行int len那一句代码有什么问题吗,如果不注释掉的话就会报错


#include<iostream>
#include<string>
using namespace std;
struct student
{
   string stuName;
   int x;//分数
};
struct teacher
{
   string tName;
   struct student stuArr[5];
};
void writeIn(struct teacher tArr[],int len)
{
    string xArr="ABCDE";
    for(int i=0;i<len;i++)
        {
            tArr[i].tName="Teacher_";
            tArr[i].tName+=xArr[i];
            for(int j=0;j<5;j++)
                {
                    tArr[i].stuArr[j].stuName="student_";
                    tArr[i].stuArr[j].stuName+=xArr[j];
                }
        }
}
void print(struct teacher tArr[],int len)
{
    for(int i=0;i<len;i++)
        {
            cout<<"老师:"<<tArr[i].tName<<endl;
            for(int j=0;j<5;j++)
                {
                    if(j==0)
                    {
                        cout<<"学生:";
                    }
                    cout<<tArr[i].stuArr[j].stuName<<" ";
                }
            cout<<endl;
        }
}
int main()
{
    struct teacher tArr[3];
    //int len=sizeof(tArr)/sizeof(tArr[0]);
    writeIn(tArr,3);
    print(tArr,3);
    return 0;
}

【以下回答由 GPT 生成】

在给出具体解决方案之前,首先需要分析代码中47行的问题所在。根据代码可以看出,在47行的注释语句int len=sizeof(tArr)/sizeof(tArr[0]);被注释掉了,这意味着在调用writeIn函数和print函数时传入的len参数是一个固定值,而不是根据数组长度自动计算得到的。

这样做有两个问题: 1. writeIn函数和print函数的循环条件i<len中的len参数不是实际需要的数组长度,会导致数组越界的风险。 2. 如果在未来修改了tArr数组的长度,那么writeIn函数和print函数中的循环条件i<len就不再正确,需要手动修改固定的len参数。

基于以上分析,可以提出以下解决方案:

首先,需要计算tArr数组的长度,以代替注释掉的int len=sizeof(tArr)/sizeof(tArr[0]);语句。可以通过在main函数中添加如下代码来计算tArr数组的长度:

int len = sizeof(tArr) / sizeof(tArr[0]);

然后,在调用writeIn函数和print函数时,将计算得到的数组长度传入作为参数:

writeIn(tArr, len);
print(tArr, len);

这样就解决了代码中47行的问题,同时避免了数组越界和手动修改循环条件的风险。

最终的代码如下:

#include <iostream>
#include <string>
using namespace std;

struct student
{
   string stuName;
   int x; // 分数
};

struct teacher
{
   string tName;
   struct student stuArr[5];
};

void writeIn(struct teacher tArr[], int len)
{
    string xArr="ABCDE";
    for(int i=0; i<len; i++)
    {
        tArr[i].tName="Teacher_";
        tArr[i].tName+=xArr[i];
        for(int j=0; j<5; j++)
        {
            tArr[i].stuArr[j].stuName="student_";
            tArr[i].stuArr[j].stuName+=xArr[j];
        }
    }
}

void print(struct teacher tArr[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout<<"老师:"<<tArr[i].tName<<endl;
        for(int j=0; j<5; j++)
        {
            if(j==0)
            {
                cout<<"学生:";
            }
            cout<<tArr[i].stuArr[j].stuName<<" ";
        }
        cout<<endl;
    }
}

int main()
{
    struct teacher tArr[3];
    int len = sizeof(tArr) / sizeof(tArr[0]);
    writeIn(tArr, len);
    print(tArr, len);
    return 0;
}


【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

报什么错误啊

在dev-c++ 5.11,编译运行没报错。

?我菜鸟教程执行你的代码没问题啊

img

你可以试试把 teacher前的 struct 去掉