[C/C++]getchar的陷阱

Getchar()的陷阱

文 BY Allen    20180912

 

昨天模拟测试的时候,测试完查看结果,发现第一题的字符串反转问题的10组数据全部超时,一头雾水,然后问了下周波老师,老师要我弄懂了这个问题后写篇小结发到群里防止大家犯错

 

 

题目

 

 

我查了下暑假的ac代码又回顾了自己测试的时候写的代码,发现核心的不同就在while循环的读入中

         Ac的代码的读入方法是

         String temp;

         While(cin >> temp)

         而全部超时的代码是:

         Char ch;

         While(ch = getchar())

 

 

Ac代码:

超时代码:

 

查阅了各种资料之后,终于明白getchar这个c库函数的设计者在设计getchar函数时为了读取文件结束符EOF(值为-1)于是将getchar()函数的返回值设置成了int型,并不是想当然的返回了一个读入的char型变量,但是由于c语言char类型可以实现向int类型的隐式类型转化,同时不超过char数据范围的int型变量也可以被char类型变量接收,所以可以使用一个char类型变量去接收一个int类型的返回值

         也就是说使用while(ch = getchar())的时候时无法接收到文件结束符号的,因为char 类型变量能接收的值是 0 – 255 所以只需要做一点小小的改动就可以避免这个错误

         就是在声明接收字符的变量的时候,使用int类型变量声明 + while循环中注明结束的标识EOF即可(经过亲自测试发现只采用int类型声明变量是不够的,依然是全部超时,必须显式地声明EOF为退出条件)即:

         Int ch;

         While((ch = getchar()) != -1){

         //

}

或者

Int ch;

While((ch = getchar()) != EOF){
         //

}

 

问题解决!!!!

 

小结一下:

 

 

 

希望能对大家有帮助,Thanks♪(・ω・)ノ

 

 

猜你喜欢

转载自blog.csdn.net/chenhanxuan1999/article/details/82656045