查资料说用方法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;
}
使用这个函数得到的结果是一长串数字,显然是错误的:
如果是写顺序表,不需要通过计算来得到长度值,因为顺序表结构体里有成员参数就是顺序表的长度值,代码修改如下,供参考:
#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;
}
函数里数组退化成指针,只能再弄一个参数,让主程序传入数组长度
不知道你这个问题是否已经解决, 如果还没有解决的话:首先,问题出现在你尝试使用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;
}
希望这些解决方法对你有帮助!如果你还有其他问题,请随时告诉我。