gpt4 book ai didi

c - 为什么我的 argv[1] 值发生变化? (C)

转载 作者:行者123 更新时间:2023-11-30 21:31:07 26 4
gpt4 key购买 nike

我的程序需要两个命令行输入,stock.csvcoins.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 -> coin[denom].denomination = strtol(token, &ptr, 01); 给我一个警告:传递给 C 运行时函数的参数无效。 code> 错误,但似乎不会以任何其他方式影响代码。

定义:(这些是预先提供的启动代码,这是针对一个类的)

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;
};

最佳答案

为什么不将签名更改为:

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 个值的枚举?

此外,初始化指针并关闭文件句柄也很重要。

关于c - 为什么我的 argv[1] 值发生变化? (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com