简体   繁体   中英

Reading in file leads to seg fault

So I've got a text file:

5f6
2f8
2f2

And I'm reading in the values : 5,6,2,8,2,2 where the first two numbers are always rows x columns, then I'm trying to draw rectangles in retrospect to the files values (This works, but after running the program and when it prints them, it seg faults).

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

int main(int argc, char * argv[])
{

    initscr();
    cbreak();
    noecho();

    char str[100];
    static char * row;
    static char * col;
    static int i;
    static int j;
    static int k;
    static int x; 
    static int y;
    int count = 0;

    FILE* file;
    file = fopen(argv[1],"r");

    if(file == NULL)
    {
        mvprintw(0,0,"File returns null pointer");
        exit(1);
    }

    while(!feof(file))
    {
        fgets(str,100,file);
        row = strtok(str,"x");
        col = strtok(NULL," \n");

        x = atol(row);
        y = atol(col);

        for(j=0;j<x;j++)
        {
            for(k=0;k<y;k++)
            {
                mvprintw(k+5,j+5+count,".");
                refresh(); //Space out drawing each rectangle? so they don't overlap
            }
        }
        count+=5;
    }

    fclose(file);
    getch();
    endwin();
    return (0);
}

I'm not really sure on how to proceed here, how would I go about eliminating this seg fault, and possibly spacing out the resultant drawing (The count variable doesn't seem to do it).

Your segmentation fault is because you are not checking whether strtok() returned NULL and you still dereference the pointer with atol() , this is an example of how to do it correctly

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

int main(int argc, char * argv[])
{
    char  str[100];
    int   j;
    int   k;
    int   count;
    FILE *file;

    file = fopen(argv[1],"r");
    if (file == NULL)
     {
        mvprintw(0, 0, "File returns null pointer");
        return 1;
     }

    initscr();
    cbreak();
    noecho();

    count = 0;
    while(fgets(str, sizeof(str), file) != NULL)
     {
        char *endptr;
        char *row;
        char *col;
        int   x;
        int   y;

        row = strtok(str, "f");
        if (row == NULL)
         {
            fprintf(stderr, "`%s' does not contain `f'\n", str);
            continue;
         }
        col = strtok(NULL, " \n");
        if (col == NULL)
         {
            fprintf(stderr, "`%s' caused an unexpected error\n", str);
            continue;
         }
        x = strtol(row, &endptr, 10);
        if (*endptr != '\0')
         {
            fprintf(stderr, "Cannot convert `%s' to integer\n", row);
            continue;
         }
        y = strtol(col, &endptr, 10);
        if (*endptr != '\0')
         {
            fprintf(stderr, "Cannot convert `%s' to integer\n", col);
            continue;
         }
        for (j = 0 ; j  < x ; j++)
         {
            for (k = 0 ; k < y ; k++)
             {
                mvprintw(k + 5, j + 5 + count, ".");
                refresh();
             }
         }
        count+=5;
     }

    fclose(file);
    getch();
    endwin();

    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM