Почему символ конца файла не интерпретируется правильно? - PullRequest
0 голосов
/ 13 апреля 2011
#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;
}

У меня странная проблема с приведенным выше кодом.В качестве небольшого фона я скомпилировал приведенный выше код C с Tiny C Compiler (TCC) и запустил исполняемый файл в командной строке Windows XP (cmd.exe).

Проблема, которая возникаетимеет отношение к символу EOF.При запуске, если я ввожу символ EOF (CTRL+Z) и затем нажимаю return, цикл, кажется, завершается правильно, но затем character заполняется символом новой строки (\n).

Итак, что-то вроде этого (в качестве ввода):

test^Ztesttwo

Будет выводить:

test\n

Из-за того, что if statement после for loop всегда выполняется.Мне интересно, почему цикл успешно завершается после распознавания символа EOF, если он продолжает захватывать другой символ из потока?

1 Ответ

5 голосов
/ 13 апреля 2011

Ваша проблема в этой строке:

if (character = '\n') {

это оператор вместо тестового оператора:

if (character == '\n') {

Вы можете предотвратить подобные ошибки, поместив константу влево, таким образом вы получите ошибку компилятора, если допустите ошибку.

if ('\n' = character) {
//       ^ wont compile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...