我的程序需要两个命令行输入stock.csv
和coins.csv
。在我的程序开始附近,我有load_check = load_data(&tm, argv[1], argv[2]);
,它将文件初始化为链接列表。问题是,这行代码正在将argv[1]
的值更改为d
,但argv[2]
仍为coins.csv
。我真的很困惑是什么导致了这个,这真的很奇怪。有什么想法吗?
load_data
的代码(现在正在将argv[1
更改为""
)
BOOLEAN load_data(tm_type * tm, char * stockfile, char * coinsfile)
{
stock_node *sstream = NULL;
char* token;
char line_no[LINE_LENGTH + 1], *ptr;
FILE *sfile, *cfile;
BOOLEAN check = TRUE;
int denom = 0;
if((sfile = fopen(stockfile, "r")) == NULL){
fprintf(stderr, "Error in %s.\n", stockfile);
check = FALSE;
}
if((cfile = fopen(coinsfile, "r")) == NULL){
fprintf(stderr, "Error in %s.\n", coinsfile);
check = FALSE;
}
sstream = tm -> stock -> head_stock;
while(fgets(line_no, LINE_LENGTH + 1, sfile) != NULL){
sstream = malloc(sizeof(tm -> stock));
sstream -> data = malloc(sizeof(struct stock_data));
token = strtok(line_no, ",");
strcpy(sstream -> data -> ticket_name, token);
token = strtok(NULL, ",");
sstream -> data -> ticket_type = token[0];
token = strtok(NULL, ",");
strcpy(sstream -> data -> ticket_zone, token);
token = strtok(NULL, ",");
sstream -> data -> ticket_price = strtol(token, &ptr, 10);
token = strtok(NULL, ",");
sstream -> data -> stock_level = strtol(token, &ptr, 10);
sstream -> next_node = tm -> stock -> head_stock;
tm -> stock -> head_stock = sstream;
}
while(fgets(line_no, LINE_LENGTH + 1, cfile) != NULL){
token = strtok(line_no, ",");
tm -> coins[denom].denomination = strtol(token, &ptr, 01);
token = strtok(NULL, ",");
tm -> coins[denom].count = strtol(token, &ptr, 10);
denom++;
}
return check;
}
变量发生在
的第五次迭代中while(fgets(line_no, LINE_LENGTH + 1, cfile) != NULL){
token = strtok(line_no, ",");
tm -> coins[denom].denomination = strtol(token, &ptr, 01);
token = strtok(NULL, ",");
tm -> coins[denom].count = strtol(token, &ptr, 10);
denom++;
}
另外,tm -> coins[denom].denomination = strtol(token, &ptr, 01);
给出了warning: Invalid parameter passed to C runtime function.
错误,但似乎没有任何其他方式影响代码。
定义:(这些是预先提供的启动代码,这是针对一个类的)
typedef struct stock_list * stock_list_ptr;
typedef struct coin * coin_list_ptr;
typedef struct tm
{
coin_list_ptr coins;
stock_list_ptr stock;
} tm_type;
struct stock_data
{
char ticket_name[TICKET_NAME_LEN+1];
char ticket_type;
char ticket_zone[TICKET_ZONE_LEN+1];
unsigned int ticket_price;
unsigned int stock_level;
};
typedef struct stock_node
{
struct stock_data * data;
struct stock_node * next_node;
} stock_node;
struct stock_list
{
stock_node * head_stock;
unsigned int num_stock_items;
};
答案 0 :(得分:0)
为什么不将签名更改为:
BOOLEAN load_data(tm_type * tm, const char * stockfile, const char * coinsfile)
这样,您可以确保load_data不会修改argv [1]和argv [2]指向的数据。 但这并不能解决你的问题。
注意警告,
tm -> coins[denom].denomination = strtol(token, &ptr, 01);
01是一个错字或面额是一个只有2个值的枚举?
此外,初始化指针和关闭文件句柄非常重要。