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;
}
  • 93zm4@programming.dev
    link
    fedilink
    arrow-up
    3
    ·
    4 days 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
      link
      fedilink
      arrow-up
      1
      ·
      4 days 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.