Golang中如何模拟C语言中的if(scanf(…)==EOF)来控制输入的终止

相信很多从C/C++转到Golang的朋友们都经常会对Go中的输入控制感到头疼。。。尤其是如果要在Go中模拟C语言中的如下代码会遇到不小困惑:

 

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. char input[100];  
  2. while (1) {  
  3.     if (scanf("%s", input) == EOF) {  
  4.         printf("输入结束\n");  
  5.         break;  
  6.     }  
  7. }  

 

 

上面这段代码在控制台中输入一个Ctrl+Z(EOF) 就可以终止输入了:

 


C语言中的 int scanf() 函数返回的是一个int类型,它的值只有三种情况:

(1)  如果一切正常,返回输入的字符个数,即值>0

(2)  如果出现错误,返回0

(3)  如果遇到结束符EOF,返回-1

注意第三条:遇到结束符会返回-1,这样就会结束输入。也就是说,如果我们输入EOF(EOF其实就是 -1),那么输入就会终止。

 

那么我们用Go来试试,用 fmt.Scanf() (int, error) 函数吧:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. var input string  
  2. for {  
  3.     ret, err := Scanf("%s\r\n", &input) //fmt.Scanf()有两个返回值  
  4. }  

 

 

我们要注意这两个返回值,第一个返回值代表fmt.Scanf()成功输入的字符个数,第二个就是返回的错误了。

我们理所当然就会想到利用返回的错误值来试试能不能实现 C那样在控制台中输入Ctrl+Z 来结束输入:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. import (  
  2.     . "fmt"  
  3.     "io"  
  4. )  
  5.   
  6. func main() {  
  7.     var input string  
  8.     for {  
  9.         _, err := Scanf("%s\r\n", &input)  
  10.         if err == io.EOF {  
  11.             break  
  12.         }  
  13.     }  
  14. }  

 

但是实验结果表明这样做没用作用,怎么输入Ctrl+Z 都无法终止输入!

 

 

对了,fmt.Scanf() 还返回了一个 int类型的返回值,对比刚才C语言中的scanf()的返回值,会不会这个改进版的C语言也像祖先一样用-1来表明EOF呢?试试吧:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. import (  
  2.     . "fmt"  
  3.     "text/scanner"  
  4. )  
  5.   
  6. func main() {  
  7.     var input string  
  8.     for {  
  9.         ret, _ := Scanf("%s\r\n", &input)  
  10.         if ret == scanner.EOF {   //或者用ret == -1  
  11.             break  
  12.         }  
  13.     }  
  14. }  

实验了之后发现这样也不能在控制台中用输入Ctrl+Z 来结束输入。

 

 

这样就奇怪了,难道Go程序获取控制台的Ctrl+Z后不会把它看做EOF???于是决定测试一下控制台中输入 Ctrl+Z 到底输入进了什么,测试代码如下:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. import (  
  2.     . "fmt"  
  3. )  
  4.   
  5. func main() {  
  6.     var input string  
  7.     for {  
  8.         _, _ = Scanf("%s\r\n", &input)  
  9.         Printf("输入的长度为:%d\n", len(input))  
  10.         Printf("输入的字符为: %s\n", input)  
  11.         Printf("输入的字符的编码为:%d\n", input[0])  
  12.     }  
  13. }  

 

运行结果显示:

ASCII码为26的字符为:

 

好吧,原来当我们在控制台中向Go程序输入Ctrl+Z 时,原来录入的编码是26。那么我们就以这么来改进我们之前的代码:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. import (  
  2.     . "fmt"  
  3.     "strings"  
  4. )  
  5.   
  6. func main() {  
  7.     var input string  
  8.     for {  
  9.         _, _ = Scanf("%s\r\n", &input)  
  10.         var eof rune = 26  
  11.         if strings.Contains(input, string(eof)) {  
  12.             Printf("输入结束\n")  
  13.             break  
  14.         }  
  15.     }  
  16. }  

这样一来就能成功的用 Ctrl+Z 来结束输入了:

 



 

 

如果转载请注明出处:http://blog.csdn.net/gophers/article/details/20656301

posted @ 2014-10-27 11:21  luckc#  阅读(724)  评论(0)    收藏  举报