为什么文件结束字符没有被正确解释?

bfi*_*her 0 c

#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;
}
Run Code Online (Sandbox Code Playgroud)

我对上面的代码有一个特殊的问题.作为一个小背景,我正在使用Tiny C编译器(TCC)编译上述C代码,并在Windows XP命令提示符(cmd.exe)中运行可执行文件.

似乎发生的问题与EOF角色有关.在运行时,如果我发出了EOF字符(CTRL+Z)然后点击返回,循环似乎正确退出,但随后character填充了换行符(\n).

所以,像这样(作为输入):

test^Ztesttwo
Run Code Online (Sandbox Code Playgroud)

输出:

test\n
Run Code Online (Sandbox Code Playgroud)

由于if statement以下事实for loop总是被执行.我想知道的是,EOF如果它继续从流中抓取另一个字符,那么在识别字符时循环成功退出的原因是什么?

rsp*_*rsp 5

你的问题是这一行:

if (character = '\n') {
Run Code Online (Sandbox Code Playgroud)

它是一个分配而不是测试运算符:

if (character == '\n') {
Run Code Online (Sandbox Code Playgroud)

您可以通过将常量保持为左来防止这样的错误,这样如果您犯了错误,您将收到编译器错误.

if ('\n' = character) {
//       ^ wont compile
Run Code Online (Sandbox Code Playgroud)