怎么求结构体数组的实际元素个数?(用于两个顺序表的合并)

查资料说用方法sizeof(s)/sizeof(struct student)的方法
我的结构体数组定义为如下:

struct student
{
    char name[10];
    char tel[10];
};
struct student s1[6]={"xxx","123","yyy","345","zzz","687"};

用sizeof的方法如下:

m=sizeof(s1)/sizeof(struct student);

得到的结果为6,我认为这个结果是数组所能容纳的最多的元素数量,即数组名后面方括号里的数字,并不是数组实际元素的个数;
所以我定义如下函数:

int Lengthlist(struct student x[])
{
    int t=0,i=0;
    while(x[i].name!=NULL)
    {
        t++;
        i++;
    }
    return t;
}

使用这个函数得到的结果是一长串数字,显然是错误的:

img


我找不出错误在哪【啊】
另外补充一下我的代码目的:
进行两个顺序表的合并,首先我得知道两个顺序表的长度,然后再第一个顺序表的最后一个元素之后添加第二个顺序表的元素(第一个顺序表所没有的元素)。所以我得计算结构体数组的实际元素个数。有哪位能帮我检查检查错误在哪啊?万分感谢!

如果是写顺序表,不需要通过计算来得到长度值,因为顺序表结构体里有成员参数就是顺序表的长度值,代码修改如下,供参考:

#include <stdio.h>
#define maxlen 50
typedef struct   //自定义数据类型
{
    char name[10];
    char tel[10];
}ElementType;

typedef struct{   // 定义顺序表结构体
    ElementType data[maxlen];//顺序表元素
    int  listlen; //顺序表里元素的个数
}seqlist;

// 定义三个数组
ElementType s1[6]={"xxx","123","yyy","345","zzz","687"};
ElementType s2[ ]={"xxx","123","yyy","345","zzz","687"};
ElementType s3[6];

int main()
{
    int m1 = sizeof(s1)/sizeof(ElementType);
    printf("数组s1[]的大小:%d\n\n", m1);

    int m2 = sizeof(s2)/sizeof(ElementType);
    printf("数组s2[]的大小:%d\n\n", m2);

    int m3 = sizeof(s3)/sizeof(ElementType);
    printf("数组s3[]的大小:%d\n\n", m3);


    seqlist list; // 定义顺序表 list
    list.listlen = 0; // 顺序表的元素个数赋初值 0
    for (int i = 0; i < m2; i++)//将数组s2[]的内容赋值给顺序表 list 里
    {
        list.data[list.listlen] = s2[i];
        list.listlen++;
    }
    for (int i = 0; i < list.listlen; i++)//输出顺序表 list
        printf("%s %s\n", list.data[i].name, list.data[i].tel);

    return 0;
}

函数里数组退化成指针,只能再弄一个参数,让主程序传入数组长度

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/1091221
  • 以下回答由chatgpt基于相关博客总结生成:

    首先,问题出现在你尝试使用sizeof(s1)/sizeof(struct student)来求解结构体数组的实际元素个数时。这种方法在求解动态分配的数组时是无效的,因为s1是一个静态数组,其大小是编译时确定的,sizeof(s1)将返回整个数组的大小。

    解决这个问题的一种方法是,在定义结构体数组的同时,记录数组的实际元素个数。例如,你可以定义一个变量size来记录元素个数,然后在初始化结构体数组时进行记录,示例如下:

    struct student s1[] = {
        {"xxx","123"}, 
        {"yyy", "345"}, 
        {"zzz", "687"}
    };
    int size = sizeof(s1) / sizeof(struct student);
    

    另一种方法是,在结构体数组的最后一个元素后加上一个空元素,作为结束标志。这样,你可以通过遍历数组,碰到结束标志来判断数组的实际元素个数。代码示例如下:

    struct student s1[7] = {
        {"xxx","123"}, 
        {"yyy", "345"}, 
        {"zzz", "687"},
        {""} // 空元素作为结束标志
    };
    int size = 0;
    while (s1[size].name[0] != '\0') {
        size++;
    }
    

    关于你尝试使用Lengthlist函数求解数组长度的问题,问题出在你使用了x[i].name!=NULL来判断元素是否存在。在C语言中,字符串数组以空字符(\0)结尾,而不是NULL。你可以修改Lengthlist函数的判断条件为x[i].name[0] != '\0'即可正确判断元素是否存在。修正后的代码示例如下:

    int Lengthlist(struct student x[])
    {
        int t=0,i=0;
        while(x[i].name[0] != '\0')
        {
            t++;
            i++;
        }
        return t;
    }
    

    希望这些解决方法对你有帮助!如果你还有其他问题,请随时告诉我。


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