Control-D结束getchar而不是程序,prog继续接收变量中的垃圾值?

时间:2015-06-24 01:06:19

标签: c getchar

我正在使用用户输入的单个字符。程序继续使用getchar获取字符,直到遇到非空格字符,然后使用该字符打印显示。

如果用户输入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; }并尝试返回1,如果边界与▒▒相比是真的,但无论如何都没有骰子。

发生了什么,我该如何处理?

2 个答案:

答案 0 :(得分:4)

按CTRL + D不会终止程序。相反,它会关闭stdin输入流。大多数命令行实用程序旨在执行某些操作,然后在发生这种情况后终止。将此与CTRL + C进行对比,CTRL + C向程序发送一个终止信号。

您的代码目前通过将getchar()的返回值分配给border来工作,因此如果getchar返回EOF,它会将EOF分配给边框,然后退出循环。您可以通过检查循环后边界是否等于EOF来测试是否发生这种情况。

正如@Olaf指出的,这里还有另一个问题。请注意,borderchargetchar返回一个整数。将border的类型更改为int,以防止以后在您的代码中出现问题。

希望这有帮助!

答案 1 :(得分:3)

实际上存在一系列问题:

  • getchar()返回int,而不是char
  • char是签名还是未签名不是由标准修复的,而是实现依赖。
  • EOF 总是 negative int
  • char返回的有效getchar()返回非负数(简化:字符代码位于低位,最高位为0)。因此实际上unsigned char已转换为int
  • 对于比较,首先将类型提升应用于通用类型。由于char的排名低于int,因此会将其提升为int(零或符号扩展)。

在任何情况下,转换将EOF映射到扩展字符集中的有效字符代码(基本集实际上是ASCII,范围是0..127)。这个阴影这个角色,首先使它们无法区分。

但是,由于类型提示,与EOF相比会为signed charunsigned char产生不同的结果:

  • signed charCHAR_MIN <= EOF(始终&lt; 0):比较可行,但原始字符也会被错误地视为EOF
  • signed charEOF < CHAR_MIN(例如-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 EOF and **then** convert to char`做出任何假设。

尝试此操作以查看getchar()返回的值:

#include <stdio.h>

int main()
{
       int ch;
       do {
              ch = getchar();
              printf("0x%08X\n", ch);
       } while ( ch != EOF ) ;
}

请记住:输入是行缓冲的,因此您必须按回车才能看到值。