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

标签 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;
}

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

出现的问题与 EOF 字符有关。运行时,如果我发出 EOF 字符 (CTRL+Z) 然后按回车键,循环似乎正确退出,但随后 character填充有换行符 (\n)。

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

test^Ztesttwo

会输出:

test\n

由于 for 循环 之后的 if 语句 总是被执行。我想知道的是,如果它继续从流中抓取另一个字符,为什么循环会在识别到 EOF 字符时成功退出?

最佳答案

你的问题是这一行:

if (character = '\n') {

它是一个赋值而不是测试运算符:

if (character == '\n') {

你可以通过把常量放在左边来防止这样的错误,这样如果你犯了错误,你就会得到一个编译器错误。

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

关于c - 为什么没有正确解释文件结束字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646007/

相关文章:

使用c语言在Linux中的/tmp文件夹中创建文本文件

c - 在eof之后从文件输入到C中的数组

c# - P/调用 const char 指针和 int 引用

c - C 中的 Base64 编码 - 这个杂散 "X"来自哪里?

fclose 后无法释放 fileName char *

c - 在右边和左边用 1 填充位表示

c++ 等效于 calloc 并为数组变量声明空间

c - 为什么下面的代码不打印值 10?

c++ - 在使用 WinCrypt 证书进行身份验证的 Windows 上创建 SSL 套接字?

c - 围绕 OpenSSH 的简单 C 包装器(在 Windows 上使用 Cygwin)