在 C 中将 EOF 作为字符读取

dra*_*in_ 0 c eof getchar

我知道这可能听起来很愚蠢,但是我怎样才能退出这个循环呢?

#include <stdio.h>
#include <stdlib.h>

int main(){
    char c;
    do {
        c = getchar();
        printf("%c", c);
    }while(c != EOF);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在读一本书并尝试做以下练习:“验证表达式 getchar() != EOF 是 0 或 1” 如果我读取存储在整数值中的 EOF 值,它将等于 -1 但如果我尝试将 -1 作为字符捕获,那就太傻了。据我了解 EOF 是一个未分配给任何其他 char 的值。

任何人都可以帮忙吗?

edit1:我知道 c 应该是一个 Integer ...我有意将其读为 char 。

编辑2:

int main(){
    int c;
    while((c = getchar()) != EOF)
    {
        printf("%d\n", c);
    }
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

----->

int main(){
    int c;
    int i = 0;
    char str[2];
    while((c = getchar()) != EOF)
    {
        str[i] = c;
        ++i;
        if(i > 1) i = 0;
        if(str[0]=='-'&&str[1]=='1')
        {
            c = EOF; // doens't exit loop
        }
        else printf("%d\n", c);


    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么我无法理解这一点。

Ste*_*mit 6

如果您像这样更改程序,可能会帮助您了解发生了什么:

#include <stdio.h>

int main(){
    int c;
    do {
        c = getchar();
        printf("%d\n", c);
    } while(c != EOF);
}
Run Code Online (Sandbox Code Playgroud)

你会注意到我有:

  1. 声明cint
  2. 使用打印它%d

如果我运行这个程序并输入“abc”,然后点击Enter然后CTRL-D,这就是我看到的:

97
98
99
10
-1
Run Code Online (Sandbox Code Playgroud)

97、98 和 99 是ab和的 ASCII 代码c。10 是换行符的代码,又名\n。然后 -1 是我输入时产生的 EOF CTRL-D。(如果你使用的是 Windows,你可以使用CTRL-Z另一个Enter。)

在这个程序中,虽然c是一个int变量,但这并不意味着它不包含字符!在 C 语言中,字符由小整数表示,这些小整数是它们在机器字符集中的代码。下面是一个修改来演示这一点:

int c;
int nch = 0;
char string[100];
do {
    c = getchar();
    printf("%d", c)
    if(c >= 32 && c < 127) {
        printf(" = '%c'", c);
        string[nch++] = c;
    }
    printf("\n");
} while(c != EOF);
string[nch] = '\0';
printf("You typed \"%s\"\n", string);
Run Code Online (Sandbox Code Playgroud)

现在打印了

97 = 'a'
98 = 'b'
99 = 'c'
10
-1
You typed "abc"
Run Code Online (Sandbox Code Playgroud)

打电话没有问题

printf(" = '%c'", c);
Run Code Online (Sandbox Code Playgroud)

即使c是一个 int 并且%c用于打印字符。
分配没有问题

string[nch++] = c;
Run Code Online (Sandbox Code Playgroud)

即使c是一个 int 并且string是一个字符数组。


P__*_*J__ 5

  1. c必须int不是char。这在未签名的实现中尤其重要char-1用 0xffffffff(32 位整数,二进制补码)表示并分配给 char 作为 0xff。比较时 0xff 总是不相等-1。这就是为什么你应该使用intnot char
  2. 打印前测试 EOF。更适合的是while(...) {}循环
int main(){
    int c;
    while((c = getchar()) != EOF)
    {
        printf("%c", c);
    }
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/6sqa98bnq

这里有一个例子,如果cchar并且char是未签名会发生什么: https://godbolt.org/z/bjfGv56z3

在此输入图像描述