Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c程序在尝试使用指针打印值时失败_C_Arrays_Pointers_Printf - Fatal编程技术网

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<代码>。