我想用一些值初始化一個結構數組,但我無法獲得值保持不變。我使用初始for循環來檢索字符串中的值並將它們分配給數組中的結構。一旦我嘗試用另一個循環遍歷該數組,其中一些值不相同。爲什麼結構初始化後結構的值會損壞?
這是有問題的代碼:
void printOrder(Order *node)
{
printf("Title is: %s\n",node->title);
printf("Price is: $%f\n",node->price);
printf("ID is: %d\n",node->custID);
printf("Category is: %s\n",node->category);
}
void initOrder(Order *newOrder, char *title, double price, int custID, char *category)
{
newOrder->title = title;
newOrder->price = price;
newOrder->custID = custID;
newOrder->category = category;
newOrder->next = NULL;
printf("new order object initialized\n");
}
char *title;
char *priceTemp;
char *idTemp;
char *category;
Order localOrders[numOrders]; // numOrders is a value found earlier
int k;
for(k = 0; k < numOrders; k++)
{
fgets(Line,orderLineSize,orders); // orderLineSize was found earlier
title = strtok(Line,"|");
priceTemp = strtok(NULL,"|");
idTemp = strtok(NULL,"|");
category = strtok(NULL,"|");
price = atof(priceTemp);
id = atoi(idTemp);
localOrders[k].title = title;
localOrders[k].price = price;
localOrders[k].custID = id;
localOrders[k].category = category;
Order *temp = &localOrders[k];
initOrder(temp,title,price,id,category);
printOrder(temp);
}
Order *temp;
for(k = 0; k < numOrders; k++)
{
temp = &localOrders[k];
printOrder(temp);
printf("\n");
}
下面是一個Order
頭文件:
#ifndef ORDER_H
#define ORDER_H
#include <stdlib.h>
struct Order {
char *title;
double price;
int custID;
char *category;
struct Order *next;
};
typedef struct Order Order;
void initOrder(Order *newOrder, char *title, double price, int custID, char *category);
void printOrder(Order *node);
#endif
例如,第一環路將打印:
Title is: "Tasting Beer: An Insider's Guide to the World's Greatest Drink"
Price is: $11.310000
ID is: 5
Category is: HOUSING01
作爲第二個循環會給我:
Title is: "Tasting Beer: An Insider's Guide to the World's Greatest Drink"
Price is: $19.800000
ID is: 2
Category is: s Guide to the World's Greatest Drink"
爲什麼我初始化第一個循環中的結構體的值在第二個循環中被覆蓋?標題似乎沒有受到影響,但其餘參數不斷被覆蓋,我不知道爲什麼。
這似乎不是有效的C代碼。圍繞測試代碼丟失了一個函數? –
要麼爲每個存儲的元素分配內存,要麼爲每個*行*(這是可行的,儘管更復雜)分配內存,但無論如何,每次讀取都在同一行緩衝區中爆炸,將之前存儲的'char * 'strtok'不會製作你的字符串的副本 – WhozCraig
你爲什麼使用VLA? –