如何循环和打印c中的结构数组?

时间:2015-06-24 02:56:00

标签: 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: %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;
    }


}

2 个答案:

答案 0 :(得分:2)

当作为参数传递给函数时,

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);
}

然后从printNames拨打main,如下所示:

printNames(people, sizeof(people)/sizeof(*people));

答案 1 :(得分:1)

在C中,数组参数衰减成指针。因此,表达式sizeof(a)/sizeof(a[0])变为sizeof(int *)/sizeof(int),结果为1(假设intint *的大小为4),因此for循环变为printNames()无论数组的大小如何,{1}}只执行一次。

因此,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;
}    

Intel Architecture-32 计算机上的<0>输出:0 0 0 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;
}