bfisher
bfisher

Reputation: 73

Why is the End-of-File character not being interpreted correctly?

#include <stdio.h>

#define MAXLENGTH 77

int getline(char[], int);

main() {
    char in_line[MAXLENGTH];
    int count, in_line_length;

    in_line_length = 0;

    for (count = 0; count < MAXLENGTH; ++count)
        in_line[count] = 0;
    in_line_length = getline(in_line, MAXLENGTH);
    printf("%s", in_line);
}

int getline(char line[], int max_length) {
    int count, character;

    character = 0;

    for (count = 0; count < (max_length -2) && (character = getchar()) != EOF && character != '\n'; count++) {
        line[count] = character;
    }
    if (character = '\n') {
        line[count++] = '\n';
    }
    line[count] = '\0';
    return count;
}

I'm having a peculiar issue with the above code. As a little background, I'm compiling the above C code with the Tiny C Compiler (TCC) and running the executable in a Windows XP command prompt (cmd.exe).

The problem that appears to be occuring has to do with the EOF character. When running, if I issue the EOF character (CTRL+Z) and then hit return, the loop seems to exit correctly, but then character is populated with a newline character (\n).

So, something like this (as input):

test^Ztesttwo

Would output:

test\n

Due to the fact that the if statement following the for loop is always executed. What I'm wondering, is why the loop successfully exits upon recognition of the EOF character if it continues to grab another character from the stream?

Upvotes: 0

Views: 142

Answers (1)

rsp
rsp

Reputation: 23373

Your problem is this line:

if (character = '\n') {

it is an assigment instead of a test operator:

if (character == '\n') {

You can prevent erros like this by putting the constant left, that way you will get a compiler error if you make a mistake.

if ('\n' = character) {
//       ^ wont compile

Upvotes: 5

Related Questions