8

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;
}
you are viewing a single comment's thread
view the rest of the comments
[-] 93zm4@programming.dev 3 points 1 week ago

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 characters
[-] oantby@lemmy.today 1 points 1 week ago

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.

[-] dr_robotBones@reddthat.com 1 points 1 week ago

I am on Linux as well, it does work but it skips empty lines which will make the line numbers inaccurate.

this post was submitted on 17 Aug 2026
8 points (100.0% liked)

C Programming Language

1336 readers
1 users here now

Welcome to the C community!

C is quirky, flawed, and an enormous success.
... When I read commentary about suggestions for where C should go, I often think back and give thanks that it wasn't developed under the advice of a worldwide crowd.
... The only way to learn a new programming language is by writing programs in it.

© Dennis Ritchie

🌐 https://en.cppreference.com/w/c

founded 3 years ago
MODERATORS