打印结构数组

时间:2012-03-07 01:34:59

标签: c arrays struct

void print(part *item, int part_count) {
    int i=0;

    for (i=0; i<part_count; i++) {
       printf("Item number: %d\n", i + 1);
       printf("Item name: %s\n", item[i].name);
       printf("Item price: $%f\n", item[i].price);
       printf("Item quantity: %d\n", item[i].quantity);
    }
}

我想打印使用不同功能创建的结构数组。我看了但是还没有找到一种不同的方式来打印它们或者我在打印语句中做错了什么。我的程序编译但在运行时崩溃。

好的,知道问题不在这些陈述中是很好的。那令我沮丧。这是添加功能。

void add(part *item, int *part_count)
 {
      if (!item)
      {
         item = malloc(sizeof(part));
      }

      item = realloc(item, sizeof(part) * *part_count + 1);

      item[*part_count].name = malloc(sizeof(char)*64); // max of 64 characters

      printf("Please enter item name: ");
      scanf("%65s", item[*part_count].name);

      printf("Please enter item price: ");
      scanf("%f", &item[*part_count].price);

      printf("Please enter item quantity: ");
      scanf("%d", &item[*part_count].quantity);

      *part_count = *part_count+ 1;
 }

5 个答案:

答案 0 :(得分:1)

item,作为add的参数是该函数的本地参数。因此,当您修改它时,这不会影响您传递给它的变量。为了获得修改后的item指针,你需要传递一个指针(指向指针的指针):

void add(part **item, int *part_count)

然后在*item

中使用(*item)(或item)当前使用add的任何地方

答案 1 :(得分:1)

void add(part **item, int *part_count)
{
  char temp[100];

  if (!(*item)){
   //printf("first alloc\n");
       *item = malloc(sizeof(part)*3);
  }
  else if (*part_count>= 3){
  //printf("realloc\n");
      *item = realloc(*item, sizeof(part) * (*part_count + 1));
  }

  item[0][*part_count].name = malloc(sizeof(char)*100); // max of 100 characters

  printf("Please enter item name: \n");
  fgets(temp, 100, stdin);     
  strcpy(item[0][*part_count].name, temp);      


  printf("Please enter item price: \n");
  fgets(temp, 100, stdin);
  sscanf(temp, "%f", &item[0][*part_count].price);      


  printf("Please enter item quantity: \n");
  fgets(temp, 100, stdin);
  sscanf(temp, "%d", &item[0][*part_count].quantity);   


  *part_count = *part_count+ 1;
}

最终这样做了。不确定是否需要使用**struct,但这是我可以使用的唯一方法。

答案 2 :(得分:0)

如果没有看到你的其他程序,就不可能有效地回答这个问题。但是,你提到“崩溃运行”,这通常意味着:

之一
  • 您违反了某些函数的API,传递了错误输入的参数或错误的参数数
  • 您正尝试取消引用或通过指向不存在的内存分配。

我强烈建议您尝试以下方法:

  • 首先,使用-Wall -Werror编译你的程序(假设这是gcc),并注意你得到的所有错误信息并修复所有错误信息。
  • 其次,尝试检查使用gdb获得的核心转储的堆栈跟踪 - 这将告诉您程序崩溃的确切位置,至少在使用-g
  • 进行编译时
  • 第三,尝试运行像Valgrind这样的系统,用于查找和诊断内存错误。

答案 3 :(得分:0)

循环显示正确构造。这表明问题在于如何构造数据,或者发送到此函数的参数存在问题。

答案 4 :(得分:0)

你应该把你的功能写成

void print(part item [],int item_count){ ... ... }

在你的函数调用中:print(item,f)