c程序在尝试使用指针打印值时失败
我还没有得到任何错误,当我试图从数组中获取值时,程序失败了。该程序包含从文件中读取产品并将其存储在类型为c程序在尝试使用指针打印值时失败,c,arrays,pointers,printf,C,Arrays,Pointers,Printf,我还没有得到任何错误,当我试图从数组中获取值时,程序失败了。该程序包含从文件中读取产品并将其存储在类型为typedef结构项的数组中的函数 这就是程序的样子: item *displayProducts(int balance){ int row=0; char line[MAX_LINE_SIZE + 1]; // ptr to the current input line static item products[8]; FILE *fp; fp =
typedef结构项的数组中的函数
这就是程序的样子:
item *displayProducts(int balance){
int row=0;
char line[MAX_LINE_SIZE + 1]; // ptr to the current input line
static item products[8];
FILE *fp;
fp = fopen("machinedata.txt", "r");
if (fp == NULL)
{
printf("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
while (fgets(line, MAX_LINE_SIZE, fp)) {
char *next_ptr = NULL;
char *next_item = strtok_s(line, ",;", &next_ptr);
while (next_item != NULL){
char *item_ptr = NULL;
char *name = strtok_s(next_item, "-", &item_ptr);
if (name == NULL)
{
fprintf(stderr, "Failed to scan name out of [%s]\n", next_item);
break;
}
int price;
next_item = strtok_s(NULL, " ,", &item_ptr);
//assert(next_item != NULL);
if (strcmp(name," ")){
if (sscanf(next_item, "%d", &price) != 1)
fprintf(stderr, "Failed to convert [%s] to integer\n", next_item);
else if (balance > price){
products[row].name = name;
products[row].price = price;
products[row].product_code = row + 1;
printf("%d) %s:%d\n",products[row].product_code, products[row].name, products[row].price);
row++;
}
next_item = strtok_s(NULL, ",;", &next_ptr);
}
}
}
fclose(fp);
return products;
}
void main( int argc, char *argv[]){
int *ptr_to_balance;
int balance = atoi(argv[2]);
ptr_to_balance = &balance;
item *ptr_to_products;
Init(argv[1], balance);
ptr_to_products = displayProducts(balance);
printf("%s", *(ptr_to_products[2].name));
}
程序将打印出文件中的所有产品,但由于某种原因,程序的最后一行失败。知道为什么吗?我想,你需要改变
printf("%s", *(ptr_to_products[2].name));
到
由于%s
需要指向以null结尾的char
数组的指针。我认为,您需要更改
printf("%s", *(ptr_to_products[2].name));
到
由于%s
需要指向以null结尾的字符数组的指针。您的产品数组中的所有指针都指向行数组。这有两个问题:
此数组是displayProducts
的本地数组,当函数返回时它将被销毁
products
is的每个元素都有指向同一行数组的指针。因此,当您从文件中读取新行时,您正在覆盖产品
以前元素中保存的值
在将其保存到products[row]
中之前,需要在堆中复制name
char *name_copy = malloc(strlen(name)+1);
strcpy(name_copy, name);
products[row].name = name_copy;
您还需要修复打印代码,如另一个答案所示:
printf("%s", ptr_to_products[2].name);
产品
数组中的所有指针都指向行
数组。这有两个问题:
此数组是displayProducts
的本地数组,当函数返回时它将被销毁
products
is的每个元素都有指向同一行数组的指针。因此,当您从文件中读取新行时,您正在覆盖产品
以前元素中保存的值
在将其保存到products[row]
中之前,需要在堆中复制name
char *name_copy = malloc(strlen(name)+1);
strcpy(name_copy, name);
products[row].name = name_copy;
您还需要修复打印代码,如另一个答案所示:
printf("%s", ptr_to_products[2].name);
欢迎来到StackOverflow。然而,这是一个可怕的代码,我们通过大量的工作!你能调试它直到发现哪里出了问题吗?你可能会自己回答这个问题,但如果不是这样,你就可以告诉我们哪里出了问题。但也要告诉我们症状,因为仅仅说“程序失败”并不能告诉我们到底出了什么问题。做所有这些,你可能会从人们那里得到一些答案。你能给我们项目结构吗?它将帮助我们typedef结构项{char*name;int-product\u-code;int-price;}item代码>发布的代码不编译。它缺少一些关键项,如“#include”语句。请重新发布代码的可编译版本,以演示潜在问题。然后告诉我们问题的症状是什么,以便我们可以帮助您。正如目前编写的,编译步骤会引发42个警告和错误!!!编译时,在使用任何“预期”命令行参数之前,启用所有警告(对于gcc使用,至少启用“-Wall-Wextra-pedantic”),始终使用main()的“argc”参数检查是否存在此类参数。如果没有足够的参数(或者参数类型错误),则打印“用法”语句并退出。欢迎使用StackOverflow。然而,这是一个可怕的代码,我们通过大量的工作!你能调试它直到发现哪里出了问题吗?你可能会自己回答这个问题,但如果不是这样,你就可以告诉我们哪里出了问题。但也要告诉我们症状,因为仅仅说“程序失败”并不能告诉我们到底出了什么问题。做所有这些,你可能会从人们那里得到一些答案。你能给我们项目结构吗?它将帮助我们typedef结构项{char*name;int-product\u-code;int-price;}item代码>发布的代码不编译。它缺少一些关键项,如“#include”语句。请重新发布代码的可编译版本,以演示潜在问题。然后告诉我们问题的症状是什么,以便我们可以帮助您。正如目前编写的,编译步骤会引发42个警告和错误!!!编译时,在使用任何“预期”命令行参数之前,启用所有警告(对于gcc使用,至少启用“-Wall-Wextra-pedantic”),始终使用main()的“argc”参数检查是否存在此类参数。如果没有足够的参数(或参数类型错误),则打印“用法”语句并退出。每个数组单元格中的值都会不断更改。。。我如何定义产品阵列,使其不会改变???感谢您的帮助,每个数组单元格中的值都在不断变化。。。我如何定义产品阵列,使其不会改变???谢谢你的帮助,我试过了,但是我遇到了一个错误,关于不能将void*转换为char*,我不能overcome@DonovenRally要明确:你正在使用C++编译器。@ DooVeCube或者你使用错误的选项给支持这两个编译器(例如GCC)。您需要使用告诉它在C模式而不是C++模式下编译的选项。我认为大多数编译器都会从文件扩展名自动计算出这一点,例如,c的.c
,代码> > CPP<代码> C++。我尝试过,但是我不能把空隙转换成char *,我不能。overcome@DonovenRally要明确:你正在使用C++编译器。@ DooVeCube或者你使用错误的选项给支持这两个编译器(例如GCC)。您需要使用告诉它在C模式而不是C++模式下编译的选项。我想大多数编译器都会自动从文件扩展中自动地找出这一点,例如C++中的代码< >代码> >代码> > CPP<代码>。