我知道这可能听起来很愚蠢,但是我怎样才能退出这个循环呢?
#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)
为什么我无法理解这一点。
如果您像这样更改程序,可能会帮助您了解发生了什么:
#include <stdio.h>
int main(){
int c;
do {
c = getchar();
printf("%d\n", c);
} while(c != EOF);
}
Run Code Online (Sandbox Code Playgroud)
你会注意到我有:
c为int%d如果我运行这个程序并输入“abc”,然后点击Enter然后CTRL-D,这就是我看到的:
97
98
99
10
-1
Run Code Online (Sandbox Code Playgroud)
97、98 和 99 是a、b和的 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是一个字符数组。
c必须int不是char。这在未签名的实现中尤其重要char。-1用 0xffffffff(32 位整数,二进制补码)表示并分配给 char 作为 0xff。比较时 0xff 总是不相等-1。这就是为什么你应该使用intnot char。while(...) {}循环int main(){
int c;
while((c = getchar()) != EOF)
{
printf("%c", c);
}
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/6sqa98bnq
这里有一个例子,如果c是char并且char是未签名会发生什么:
https://godbolt.org/z/bjfGv56z3