Control-D 结束 getchar 而不是程序,prog 继续接收变量中的垃圾值?
Control-D ends getchar but not program, prog continues with garbage value in receiving variable?
我正在接受用户输入的单个字符。该程序继续使用 getchar 获取字符,直到遇到非 space 字符,然后使用该字符打印显示。
如果用户输入 control-D 而不是字符,则 getchar 输入终止,程序也应该终止。
char border;
printf("Enter the character for the border: ");
while ((border = getchar()) != EOF && border != '\n') {
if (!isspace(border)){
break;
}
}
除非我输入 control-D,循环终止...程序将垃圾字符 ▒▒ 分配给边框,然后继续程序。
我已经尝试 if (!border) { return 1; }
并尝试 return 1 如果与 ▒▒ 相比的边界为真,但无论如何都没有骰子。
这是怎么回事,我该如何处理?
按 CTRL+D 不会终止程序。相反,它会关闭 stdin 输入流。大多数命令行实用程序旨在执行某些操作,然后在发生这种情况后终止。将此与 CTRL+C 对比,CTRL+C 向程序发送终止信号。
您的代码目前通过将 getchar()
的 return 值分配给 border
来工作,因此如果 getchar returns EOF,它会将 EOF 分配给边界,然后退出循环。您可以通过检查循环后 border 是否等于 EOF
来测试是否发生这种情况。
正如@Olaf 所指出的,这里还有另一个问题。请注意 border
是一个 char
而 getchar
return 是一个整数。将 border
的类型更改为 int
以防止稍后在您的代码中出现问题。
希望对您有所帮助!
实际上存在一系列问题:
getchar()
returns int
,不是char
.
char
是有符号还是无符号未由标准确定,但取决于实现。
EOF
是 总是 一个 negative int
.
- 一个有效的
char
returned by getchar()
是returned non-negative(简化:字符代码在低位,高位是0).所以实际上是unsigned char
转换为int
.
- 为了进行比较,类型提升首先应用于常见类型。由于
char
的等级低于 int
,它被提升为 int
(零或符号扩展)。
在任何情况下,转换映射 EOF
到扩展字符集中的有效字符代码(基本集实际上是 ASCII,范围为 0..127)。这 遮蔽了 角色,使两者一开始就难以区分。
但是,由于类型提升,与 EOF
相比,signed char
和 unsigned char
会产生不同的结果:
signed char
、CHAR_MIN <= EOF
(总是 < 0):比较会起作用,但原始字符也会被错误地视为 EOF
。
signed char
, EOF < CHAR_MIN
(e.g. -129): 那其实就是未定义的行为,一切皆有可能。对于典型情况(2s 补码,高位被截断,结果很可能是正数。从不比较等于(负数!)EOF
。
unsigned char
:提升为正整数,永远不会等于(负)EOF
。
注意不要对 EOF except for what the standard defines (it is negative). So, always asign
getchar()to an
int, test for
EOFand **then** convert to
char` 做任何假设。
试试看 return 编辑的值 getchar()
:
#include <stdio.h>
int main()
{
int ch;
do {
ch = getchar();
printf("0x%08X\n", ch);
} while ( ch != EOF ) ;
}
记住:输入是行缓冲的,所以你必须按 return 才能看到值。
我正在接受用户输入的单个字符。该程序继续使用 getchar 获取字符,直到遇到非 space 字符,然后使用该字符打印显示。
如果用户输入 control-D 而不是字符,则 getchar 输入终止,程序也应该终止。
char border;
printf("Enter the character for the border: ");
while ((border = getchar()) != EOF && border != '\n') {
if (!isspace(border)){
break;
}
}
除非我输入 control-D,循环终止...程序将垃圾字符 ▒▒ 分配给边框,然后继续程序。
我已经尝试 if (!border) { return 1; }
并尝试 return 1 如果与 ▒▒ 相比的边界为真,但无论如何都没有骰子。
这是怎么回事,我该如何处理?
按 CTRL+D 不会终止程序。相反,它会关闭 stdin 输入流。大多数命令行实用程序旨在执行某些操作,然后在发生这种情况后终止。将此与 CTRL+C 对比,CTRL+C 向程序发送终止信号。
您的代码目前通过将 getchar()
的 return 值分配给 border
来工作,因此如果 getchar returns EOF,它会将 EOF 分配给边界,然后退出循环。您可以通过检查循环后 border 是否等于 EOF
来测试是否发生这种情况。
正如@Olaf 所指出的,这里还有另一个问题。请注意 border
是一个 char
而 getchar
return 是一个整数。将 border
的类型更改为 int
以防止稍后在您的代码中出现问题。
希望对您有所帮助!
实际上存在一系列问题:
getchar()
returnsint
,不是char
.char
是有符号还是无符号未由标准确定,但取决于实现。EOF
是 总是 一个 negativeint
.- 一个有效的
char
returned bygetchar()
是returned non-negative(简化:字符代码在低位,高位是0).所以实际上是unsigned char
转换为int
. - 为了进行比较,类型提升首先应用于常见类型。由于
char
的等级低于int
,它被提升为int
(零或符号扩展)。
在任何情况下,转换映射 EOF
到扩展字符集中的有效字符代码(基本集实际上是 ASCII,范围为 0..127)。这 遮蔽了 角色,使两者一开始就难以区分。
但是,由于类型提升,与 EOF
相比,signed char
和 unsigned char
会产生不同的结果:
signed char
、CHAR_MIN <= EOF
(总是 < 0):比较会起作用,但原始字符也会被错误地视为EOF
。signed char
,EOF < CHAR_MIN
(e.g. -129): 那其实就是未定义的行为,一切皆有可能。对于典型情况(2s 补码,高位被截断,结果很可能是正数。从不比较等于(负数!)EOF
。unsigned char
:提升为正整数,永远不会等于(负)EOF
。
注意不要对 EOF except for what the standard defines (it is negative). So, always asign
getchar()to an
int, test for
EOFand **then** convert to
char` 做任何假设。
试试看 return 编辑的值 getchar()
:
#include <stdio.h>
int main()
{
int ch;
do {
ch = getchar();
printf("0x%08X\n", ch);
} while ( ch != EOF ) ;
}
记住:输入是行缓冲的,所以你必须按 return 才能看到值。