首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制-D结束getchar而不是程序,prog继续在接收变量中使用垃圾值?

控制-D结束getchar而不是程序,prog继续在接收变量中使用垃圾值?
EN

Stack Overflow用户
提问于 2015-06-24 01:06:18
回答 2查看 362关注 0票数 2

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

如果用户输入control而不是字符,getchar输入就会终止,程序也应该终止。

代码语言:javascript
运行
复制
   char border;
   printf("Enter the character for the border: ");
   while ((border = getchar()) != EOF && border != '\n') {
     if (!isspace(border)){
        break;
     }
   }

除非我输入control,循环terminates...and程序将垃圾字符▒▒分配给边框,然后继续程序。

我尝试过if (!border) { return 1; }并尝试返回1,如果边框与▒▒相比是真的话,但两者都没有骰子。

怎么回事,我该怎么处理?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-24 01:16:44

按CTRL+D并不会终止程序。相反,它关闭stdin输入流。大多数命令行实用程序都是设计用来做一些事情,然后在这种情况发生后终止。将此与CTRL+C进行对比,后者向程序发送杀死信号。

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

正如@Olaf所指出的,这里还有另一个问题。注意,border是一个char,而getchar返回一个整数。将border类型更改为int,以防止代码后面出现问题。

希望这能有所帮助!

票数 4
EN

Stack Overflow用户

发布于 2015-06-24 01:17:41

其实有一连串的问题:

  • getchar()返回int,而不是char
  • char是否被签名并不是由标准确定的,而是取决于实现的。
  • EOF总是一个负面 int
  • char返回的有效getchar()非负返回(简化:字符代码位于较低的位,最上面的位为0)。因此,它实际上是将unsigned char转换为int
  • 为了进行比较,首先将类型提升应用于公共类型。由于char的级别低于int,所以它被提升为int (零或符号扩展)。

无论如何,强制转换将EOF映射到扩展字符集中的有效字符代码(基本集实际上是ASCII,范围为0..127)。这就阴影了角色,使得这两个角色一开始就无法区分。

然而,由于类型的不同,与EOF相比,signed charunsigned char的结果不同。

  • signed charCHAR_MIN <= EOF (总是< 0):比较将有效,但原始字符也将错误地视为EOF
  • signed charEOF < CHAR_MIN (例如-129):这实际上是未定义的行为,一切都可能发生。对于典型情况(2s互补,上位截断),其结果很好地是正的。从未将其与(负的) EOF进行比较。
  • unsigned char:提升为正整数,绝不等于(负) EOF

注意不要对EOF except for what the standard defines (it is negative). So, always asigngetchar()to anint, test forEOFand **then** convert tochar`.作任何假设

试着看一下getchar()返回的值

代码语言:javascript
运行
复制
#include <stdio.h>

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

记住:输入是行缓冲的,所以你必须按回车才能看到值.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31015948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档