加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 18:55:44 所属栏目:大数据 来源:网络整理
导读:相信很多从C/C++转到Golang的朋友们都经常会对Go中的输入控制感到头疼。。。尤其是如果要在Go中模拟C语言中的如下代码会遇到不小困惑: char input[100];while (1) { if (scanf("%s",input) == EOF) { printf("输入结束n"); break; }} 上面这段代码在控制台

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

char input[100];
while (1) {
    if (scanf("%s",input) == EOF) {
        printf("输入结束n");
        break;
    }
}

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




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

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

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

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

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


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

var input string
for {
	ret,err := Scanf("%srn",&input) //fmt.Scanf()有两个返回值
}


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

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

import (
	. "fmt"
	"io"
)

func main() {
	var input string
	for {
		_,&input)
		if err == io.EOF {
			break
		}
	}
}
但是实验结果表明这样做没用作用,怎么输入Ctrl+Z 都无法终止输入!


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

import (
	. "fmt"
	"text/scanner"
)

func main() {
	var input string
	for {
		ret,_ := Scanf("%srn",&input)
		if ret == scanner.EOF {   //或者用ret == -1
			break
		}
	}
}
实验了之后发现这样也不能在控制台中用输入Ctrl+Z 来结束输入。


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

import (
	. "fmt"
)

func main() {
	var input string
	for {
		_,_ = Scanf("%srn",&input)
		Printf("输入的长度为:%dn",len(input))
		Printf("输入的字符为: %sn",input)
		Printf("输入的字符的编码为:%dn",input[0])
	}
}

运行结果显示:


ASCII码为26的字符为:



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

import (
	. "fmt"
	"strings"
)

func main() {
	var input string
	for {
		_,&input)
		var eof rune = 26
		if strings.Contains(input,string(eof)) {
			Printf("输入结束n")
			break
		}
	}
}
这样一来就能成功的用 Ctrl+Z 来结束输入了:





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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读