I’m trying to make some sort of simple console text editor program to get better with C. I’m having trouble with what I thought would be a somewhat simple task:
How do I get each line from my char* buffer, which contains all of my text, so I can output each line, including empty lines, with the correct line number in front of it.
I tried several different ways already, but none have stuck. I tried strtok(), which is what is currently pushed to my repo, and it ignores whitespace. I tried strchr() but did not have the slightest idea how that function worked and got an infinite loop. I tried doing my own function to create an array of lines but that lead to a segmentation fault which was not fixed by mallocing the array. I am at a loss here, I’m not sure what I can do.
Here is the repo: https://codeberg.org/Mister_Bones/txt-ed
Here is the offending code:
// Print contents of file
int print_file(char* buffer) {
// Print a new line
printf("\n");
// Print each line with line number
// Set first line
int line_num = 1;
// Get individual line from buffer
char* line = strtok(buffer, "\n");
// Loop through and print lines
// TODO: Don't ignore whitespace
while (line != NULL) {
printf("%4d\t%s\n", line_num, line);
line = strtok(NULL, "\n");
line_num++;
}
return 0;
}


Any chance you are running this on an OS with a “new line” character that isn’t “\n”? Windows for example could be “\r\n”. I tried on Linux and it worked, although I only grabbed the necessary parts, so if something else is breaking, I can’t say. Or perhaps I misunderstood the issue altogether. Here is what I see:
The function:
# code block int print_file(char* buffer) { printf("print_file\n"); int line_num = 1; char* line = strtok(buffer, "\n"); while(line != NULL) { printf("%4d\t%s\n", line_num, line); line = strtok(NULL, "\n"); line_num++; } return 0; }And the output:
# code block test file: test.txt hello 123 123 123 asdf asdf asdf 0oijf0w0j s0w0wfjwef 0wefjfjwefjkwejijiowefjo output: 1 hello 123 123 123 2 asdf asdf asdf 3 0oijf0w0j s0w0wfjwef 4 0wefjfjwefjkwejijiowefjo count: 4 lines | 0 words | 82 charactersI am on Linux as well, it does work but it skips empty lines which will make the line numbers inaccurate.
It feels like your file may have been CRLF instead of just LF. strtok would eat an empty line if it was strictly delimited by the given delimiter. Removing empty tokens is part of its intentional behavior.