如何在c中循环和打印结构数组?
我正在编写一个独立于main的函数,该函数读入一个结构数组并打印每个数组元素的结构元素。然而,我的问题是循环通过这个数组来打印每个元素的条件语句。sizeof(a)/sizeof(a[])在函数中不起作用,因为它在原型中等于零。我有什么遗漏吗?我尝试过指针算法,但它也不起作用如何在c中循环和打印结构数组?,c,arrays,function,loops,C,Arrays,Function,Loops,我正在编写一个独立于main的函数,该函数读入一个结构数组并打印每个数组元素的结构元素。然而,我的问题是循环通过这个数组来打印每个元素的条件语句。sizeof(a)/sizeof(a[])在函数中不起作用,因为它在原型中等于零。我有什么遗漏吗?我尝试过指针算法,但它也不起作用 void printNames( person a[]){ int i; for(i = 0;i<sizeof(a)/sizeof(a[0]);i++) printf("Name:
void printNames( person a[]){
int i;
for(i = 0;i<sizeof(a)/sizeof(a[0]);i++)
printf("Name: %s | Age: %d\n", a[i].name, a[i].age);
}
int main(int argc, char *argv[]){
if (argc == 1 || argc%2 == 0){
printf("Invalid arguments.\n Usage: %s name1 age1 name2 age2 ...", argv[0]);
return 0;
}
printf("You have entered %d person(s) into the program.\n", argc/2);
person people[argc/2];
int i;
for (i = 0; i<argc/2;i++){
strcpy(people[i].name, argv[i*2+1]);
people[i].age = atoi(argv[i*2+2]);
if(people[i].age <= 0){
printf("Invalid age <= 0. Try again.");
return 0;
}
}
void打印名(人员a[]{
int i;
对于(i=0;i当作为参数传递给函数时,a
将成为指针,因此它无法仅从该指针计算出数组的大小,您必须通知函数其大小:
void printNames(person *a, size_t num)
{
int i;
for (i = 0; i < num; i++)
printf("Name: %s | Age: %d\n", a[i].name, a[i].age);
}
在C语言中,数组参数被衰减成指针。因此,表达式sizeof(a)/sizeof(a[0])
变成sizeof(int*)/sizeof(int)
,结果是1(假设int
和int*
的大小为4),因此printNames()中的循环的
只执行一次,与数组大小无关
因此,在这些情况下,sizeof
不应用于获取元素数。相反,我们可以将数组大小的附加参数传递给printNames()
考虑以下C程序:
#include<stdio.h>
void func(int array[])
{
int i;
int arraySize = sizeof(array)/sizeof(array[0]); /* arraySize <-- 1<-- 4/4 */
for (i = 0; i < arraySize; i++)
{
array[i] = i;
}
}
int main()
{
int i;
int array[4] = {0, 0 ,0, 0};
func(array);
for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
printf(" %d " ,arr[i]);
getchar();
return 0;
}
#包括
void func(整型数组[])
{
int i;
int arraySize=sizeof(array)/sizeof(array[0]);/*arraySize显示最小的代码。数组作为参数传递时会衰减为指针,因此sizeof(a)
是指向a
的指针的大小,而不是数组的大小。您需要显式传递数组的长度。除了rpattiso所说的以外,请注意,您不能使用人名[argc/2]在C中声明数组
因为argc
是一个变量。在编译时大小未知的数组必须用malloc()
分配。宏sizeof()
也是在编译时运行的。如果您无法计算动态分配数组的大小,您必须以其他方式跟踪数组大小。@Havenardperson-people[argc/2]
是VLA。VLA可以从C99开始使用。sizeof也不是宏。sizeof也适用于VLA(在运行时)。@Flower:sizeof(myarray)/sizeof(myarray[0])
对于原始数组(这里是“people”)来说是一件非常合适的事情。如果您将长度取在printNames()之外,那么like就好了。但是,正如Tryin正确指出的那样,“数组引用衰减为printNames()内部的指针”。一个常见的解决方案是添加一个“int length”printNames的参数,例如:printNames(people,sizeof(people)/sizeof(people[0]);
。
#include<stdio.h>
void func(int array[])
{
int i;
int arraySize = sizeof(array)/sizeof(array[0]); /* arraySize <-- 1<-- 4/4 */
for (i = 0; i < arraySize; i++)
{
array[i] = i;
}
}
int main()
{
int i;
int array[4] = {0, 0 ,0, 0};
func(array);
for(i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
printf(" %d " ,arr[i]);
getchar();
return 0;
}
#include<stdio.h>
void func(int array[], size_t arraySize)
{
int i;
for (i = 0; i < arraySize; i++)
{
array[i] = i;
}
}
int main()
{
int i;
int array[4] = {0, 0 ,0, 0};
func(array, 4);
for(i = 0; i < sizeof(array)/sizeof(array[0]); i++)
printf(" %d ", array[i]);
getchar();
return 0;
}