2015-05-22 3 views
1

У меня пока нет ошибки, когда я пытаюсь получить значение из массива, из-за которого программа не работает. Программа содержит функцию для чтения продуктов из файла и хранения их в массиве типа typedef structure item.c сбой программы при попытке распечатать значение с помощью указателя

Это как программа выглядит следующим образом:

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

} 

программа распечатает все продукты из файла, но по какой-то причине последней строки программы терпит неудачу. Любая идея почему?

+1

Добро пожаловать в StackOverflow. Тем не менее, это очень много кода для нас! Можете ли вы отладить его, пока не найдете, где это происходит? Вы можете ответить на вопрос самостоятельно, но если нет, тогда вы сможете сказать нам, где это происходит. Но также расскажите нам о симптом, поскольку просто говорят, что «программа терпит неудачу» не говорит нам, что на самом деле происходит неправильно. Делайте все это, и вы можете получить ответы от людей. – GuyH

+0

не могли бы Вы предоставить нам структуру позиции? это поможет нам –

+0

'typedef struct item { \t char * name; \t int product_code; \t int price; } item; ' –

ответ

2

Я думаю, вам нужно изменить

printf("%s", *(ptr_to_products[2].name)); 

в

printf("%s", ptr_to_products[2].name); 

, как %sожидает указатель на завершающем нульchar массива.

+0

Значение продолжает меняться в каждой ячейке массива ... как я могу определить массив продуктов так, как он не изменится?спасибо за помощь –

2

Все указатели в вашем products массив указывают на массив line. Это две проблемы:

  1. Этот массив является локальным для displayProducts, и он будет уничтожен, когда функция возвращает.

  2. Каждый элемент products имеет указатели на один и тот же линейный массив. Поэтому, когда вы читаете новую строку из файла, вы переписываете значения, сохраненные в предыдущих элементах products.

Вы должны сделать копию name в куче, прежде чем сохранить его в products[row].

char *name_copy = malloc(strlen(name)+1); 
    strcpy(name_copy, name); 
    products[row].name = name_copy; 

Вы также должны установить код печати, как и в другой ответ:

printf("%s", ptr_to_products[2].name); 
+0

Я пробовал это, но у меня есть ошибка о cant convert void * to char *, который я не смог преодолеть –

+1

Вы не должны получать эту ошибку в C, только в C++. – Barmar

+0

@DonovenRally: Чтобы быть явным: тогда вы используете компилятор C++. – alk

Смежные вопросы