如何覆盖结构数组元素中的数据?

时间:2015-10-21 22:47:51

标签: android c

所以,我有这个结构:

typedef struct{
    int serialNumber;
    char name[100];
    float price;
    int quantity;
 }Products;

我动态创建了一个结构数组。

任务是模拟'杂货店,用户能够添加和编辑商店出售的商品。以下代码片段用于编辑结构数据。

void overwrite(Products store){
   printf("Enter new serial number: ");
   scanf("%d", &(store.serialNumber));

   getchar();

   printf("Enter new product name: ");
   fgets(store.name, 100, stdin);
   store.name[strlen(store.name)-1]='\0';

   printf("Enter new product price: ");
   scanf("%f", &(store.price));

   printf("Enter new product quantity: ");
   scanf("%d", &(store.quantity));
 }

void editData(Products *store, int storeCapacity){ //storeCapacity needed to invoke printData(), assume a working code for the function.

  int choice;

  printData(store, storeCapacity);
  printf("Enter slot number of product here: ");
  scanf("%d", &choice);

  overwrite(store[choice]);
}

这里有捕获,即使这段代码有效,当我尝试打印数据时,数据会显示应该覆盖的值。我忘了做某事吗?我希望你能帮助我。

BTW,我在Android手机上编码。

3 个答案:

答案 0 :(得分:1)

void overwrite(Products store){

C是按值传递的,您需要将指针传递给Products(即Products *store)并相应地修改overwrite中的editData调用。

答案 1 :(得分:0)

基本上问题是在C中你按值传递参数。所以当你指定这个签名时

Products myStore;
overwrite(myStore);

你在某个地方调用它:

myStore

发生的是Products的副本被创建并放置在堆栈上,然后将值传递给函数。这意味着对overwrite内的overwrite对象所做的每个修改都适用于传递的副本,而不是原始对象。退出myStore函数的范围时,将丢弃此副本。

要解决此问题,您必须传递指向对象的指针,该指针通过值传递,但作为地址将指向完全相同的void overwrite(Products* store) { .. scanf("%f", &store->price); .. } Products myStore; overwrite(&myStore); 对象。这是以这种方式完成的:

const substitution[] = " !\"#$%&'()*+,-./0123456789:;<=>?@BCD3F9H!JKLMNOPQR$TUVW*YZ[\]^_`@bcd3f9h!jklmnopqr$tuvw*yz{|}~";

答案 2 :(得分:0)

根据Ouah,我将结构作为值本身传递,这确实发生在我的代码中。

所以我做的是......

void overwrite(Products * store){ //formal parameter changed into a pointer
  //codes here
}

和...

overwrite(&(store[choice])); /* actual parameter changed into a pointer by affixing ampersand*/

Jack解释了对代码不当行为的进一步解释。我向你表示感谢。代码现在可以正常工作。