所以,我有这个结构:
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手机上编码。
答案 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解释了对代码不当行为的进一步解释。我向你表示感谢。代码现在可以正常工作。