Почему я получаю ошибку сегментации в конце функции (C)? - PullRequest
0 голосов
/ 11 октября 2018

Я получаю ошибку сегментации в конце readFirst ().Если я проверяю оператор печати для проверки, иногда оператор печати не появляется.Код компилируется, но когда я его запускаю, он просто печатает файл, как и положено, а затем выдает ошибку в операторе return.Я понятия не имею, в чем проблема, и не знаю, как ее исправить.

int readFirst(FILE *file){
    int c;
    int linecount = 0;
    int newLineCounter = 0;
    while ((c = fgetc(file)) != EOF)
    {
        printf("%c", c);
        if(c == '\n'){
            newLineCounter++;
        }
            linecount++;
    }
    file = file + '\0';
    printf("check 3");
    //printf("\n");

    printf("%i",newLineCounter);
    return newLineCounter;
}

int main (int argc, char **argv)
{
    char *infile = NULL;
    char *outfile = NULL;
    FILE *file = stdin;
    FILE *text = stdout;
    char ch[200];
    int iFlag = 0;
    int oFlag = 0;
    char *iValue = NULL;
    int index;
    int i;

    opterr = 0;

    while ((i = getopt (argc, argv, "i:o:")) != -1) {
            switch (i)
            {
            case 'i':
                iFlag = 1;
            infile = optarg;
                break;
            case 'o':
            oFlag = 1;
                outfile = optarg;
                break;
            case '?':
                if(optopt == 'i') {
                fprintf(stderr, "Missing mandatory input option\n");
            } else if (optopt == 'o') {
                fprintf(stderr, "Missing mandatory input option\n");
                } else {
                fprintf(stderr, "Invalid option received\n");
                }
            break;
            }
    }

    if (infile){
        file = fopen(infile, "r");
        if (file == NULL){
            //printf("cannot open input file \n");
            exit(1);
        }
        //fprintf(file,"%s", infile);
        //fprintf(file,"%s", infile);

    }
    printf("check 1");
    int lines;
    lines = readFirst(file);
    printf("check 2");
    printf("%i", lines);

    char labels [lines][6];

    int c;
    int lineCount = 0;
    int curCol = 0;
    int flag = 0;


    for(lineCount = 0; i < lines; lineCount++){
        for(curCol = 0; i < 6; curCol++){
            labels[lineCount][curCol] = ' ';
        }
    }

    while(lineCount < lines && (c = fgetc(file)) != EOF){
        if(flag != 0){
            if(c != ' ' || c != '\t'){
                labels[lineCount][curCol] = c;
                curCol++;
            }else {
                curCol = 0;
                flag = 0;
            }
        }

        if(c == '\n'){
            flag = 1;
            lineCount++;
        }
    }


    printf("%i", lineCount);

    for(lineCount = 0; i < lines; lineCount++){
        for(curCol = 0; i < 6; curCol++){
            printf("%c",labels[lineCount][curCol]);
        }
    }


}

1 Ответ

0 голосов
/ 11 октября 2018

Проблема здесь, во внутреннем цикле

for(lineCount = 0; i < lines; lineCount++){
    for(curCol = 0; i < 6; curCol++){
        printf("%c",labels[lineCount][curCol]);
    }
}

Переменная, которую я никогда не обновляю в этом цикле, поэтому оба цикла будут работать вечно, вызывая доступ меток к массиву вне границ.

...