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.