Ядро ошибки сегментации выгружено на языке C

У меня проблема с ошибкой сегментации (дамп ядра) в C. Я компилирую с помощью gcc и не могу это исправить! Вот код, который должен просматривать файл csv и выполнять 1 из 4 операций:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


int main(int argc, const char * argv[])
{
    int lines=0, i=0, a=0;
    char strings[128], *broken=" ", *array[100][4], *err=" ";

    FILE *file;
    file=fopen("inventory.csv", "a+");
    broken= malloc(1000);
    err=malloc(100);

    while(fgets(strings, sizeof strings, file)!=NULL){
        ++lines;
        a=0;
        broken=strtok(strings, ",");
        while(broken!=NULL){
            strcpy( array[i][a], broken);
            a++;
        }
        i++;
    }        
    if(strcmp(argv[1], "list")==0){
        printf("Name, Quantity, Reorder limit, Cost");
        while(fgets(strings, sizeof strings, file)!=NULL){
            while(broken!=NULL){
                printf("%s, ", array[i][a]);
            }
            printf("\n");
        }
    }
    else if(strcmp(argv[1], "reorder")==0){
        int i=0;
        printf("We need to purchase more of the following items: \n");
        for(i=0;i<lines;i++){
            if(strtod(array[i][1], &err)<=strtod(array[i][2],&err)){                
                printf("%s\n", array[i][0]);                        
            }
        }
    }
    else if(strcmp(argv[1], "deduct")==0){
        if(argv[2]){
            int i=0;
            char str[100];

            for(i=0;i<lines;i++){
                if(strcmp(argv[2], array[i][0])==0){
                    if(strtod(array[i][1],&err)-1>0){
                        sprintf(str,"%f",strtod(array[i][1],&err)-1);
                        array[i][1]=str;
                        printf("Success\n");
                        fseek(file, 0, 1);
                        sprintf(str,"%s,%s,%s,%s", array[i][0], array[i][1],
                            array[i][2], array[i][3]);
                        fwrite(str,1,sizeof(str),file);
                    }
                    else{
                        printf("There are none left!\n");
                    }
                }
            }
        }
        else{
            printf("Enter a food item");
        }
    }
    else if(strcmp(argv[1], "add")==0){
        fseek(file, 0, 2);
        char str[100];
        sprintf(str,"%s,%s,%s,%s\n",argv[2],argv[3],argv[4],argv[5]);
        fwrite(str,1,sizeof(str),file);

    }
    else{
        printf("Please enter an argument: list, reorder, deduct _name_, add _name_ 
            _qty_ _reorderlimit_ _price_\n");
    }

    fclose(file);
    return 0;
}

person Norton    schedule 11.03.2014    source источник
comment
file = fopen (inventory.csv, a +); Лучше проверить возвращаемое значение для fopen, если значение null не продвигается дальше.   -  person M Thotiger    schedule 11.03.2014
comment
пожалуйста, используйте правильный отступ!   -  person zoska    schedule 11.03.2014
comment
strcpy( array[i][a], broken); array[i][a] необходимо указать на область, зарезервированную для хранения строк.   -  person BLUEPIXY    schedule 12.03.2014


Ответы (1)


Невозможно выйти из цикла while.

Я бы написал еще один стрток в:

broken=strtok(strings, ",");
            while(broken!=NULL){
               strcpy( array[i][a], broken);
               broken=strtok(NULL,",");
               a++;
            }
person gkovacs90    schedule 11.03.2014
comment
Еще дает дамп ядра :( - person Norton; 12.03.2014