最近开始学习GO语言,并做了一些编程练习。有道题要输入带空格的字符串,这在C/C++中很容易实现,但GO中好像并不那么容易。学过C/C++的可能都知道,在C中可以使用gets()函数,在C++可以使用getline()函数来实现输入带空格的字符串。那我们可能要问在GO中有没有类似的函数?答案是否定的。

在GO中除了fmt和os包,我们还可以使用bufio来实现带缓存输入和输出。

我们要怎样读取用户从键盘(控制台)输入的数据?输入是指从键盘或其它标准输入(os.Stdin)读取数据。

使用fmt包里的Scan_或Sscan_系列函数输入

package main

import "fmt"

var (
firstName, lastName string
str1, str2, str3 string
num int
str = "We / love / Go / 1314"
format = "%s / %s / %s / %d"
) func main() {
fmt.Println("Please input your full name: ")
// 使用Scan输入
fmt.Scan(&firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) fmt.Println("Please again input your full name: ")
// 使用Scanln输入
fmt.Scanln(&firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) fmt.Println("Please again input your full name: ") // 使用Scanf输入
fmt.Scanf("%s %s", &firstName, &lastName)
fmt.Printf("Hi %s %s!\n", firstName, lastName) fmt.Println("From the str we read: ") // 使用Sscanf读取
fmt.Sscanf(str, format, &str1, &str2, &str3, &num)
fmt.Println(str1, str2, str3, num)
}

若输入为:

xiao hua
xiao ming
xiao hong

则输出为:

Please input your full name:
xiao hua
Hi xiao hua!
Please again input your full name:
xiao ming
Hi xiao ming!
Please again input your full name:
xiao hong
Hi xiao hong!
From the str we read:
We love Go 1314

Scan()函数原型为:

func Scan(a ...interface{}) (n int, err error) {
return Fscan(os.Stdin, a...)
}

Scan从标准输入扫描文本,将成功读取的空白分隔的值保存进成功传递给本函数的参数。换行视为空白。返回成功扫描的条目个数和遇到的任何错误。如果读取的条目比提供的参数少,会返回一个错误报告原因。

Scanln()函数原型为:

func Scanln(a ...interface{}) (n int, err error) {
return Fscanln(os.Stdin, a...)
}

Scanln类似于Scan,但会在换行符处停止扫描,在最后一个条目后必须有换行符或EOF。

Scanf()函数原型为:

func Scanf(format string, a ...interface{}) (n int, err error) {
return Fscanf(os.Stdin, format, a...)
}

Scanf从标准输入扫描文本,根据format参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

输入中的换行符必须与格式中的换行符匹配。

Sscanf()函数原型为:

func Sscanf(str string, format string, a ...interface{}) (n int, err error) {
return Fscanf((*stringReader)(&str), format, a...)
}

Sscanf从字符串str扫描文本,根据format参数指定的格式将成功读取的空白分隔的值保存进成功传递给本函数的参数。返回成功扫描的条目个数和遇到的任何错误。

输入中的换行符必须与格式中的换行符匹配。

Scan与Scanln方法的区别:

  • Scan函数会识别空格左右的内容,哪怕换行符存在也不会影响Scan对内容的获取。
  • Scanln函数会识别空格左右的内容,但是一旦遇到换行符就会立即结束,不论后续还是否存在需要输入的内容。

使用bufio包里带缓冲的Reader实现带空格字符串的输入

package main

import (
"bufio"
"fmt"
"os"
)
//var inputReader *bufio.Reader
//var input string
//var err error func main() { inputReader := bufio.NewReader(os.Stdin) // 使用了自动类型推导,不需要var关键字声明
//inputReader = bufio.NewReader(os.Stdin) fmt.Println("Please input your name: ") //input, err = inputReader.ReadString('\n')
input, err := inputReader.ReadString('\n') if err == nil {
fmt.Printf("Your name is: %s\n", input)
}
}

若输入为:

xiao hua

则输出为:

Please input your name:
xiao hua
Your name is: xiao hua

上例中,inputReader是个指针,它指向一个bufio类的Reader,然后在main函数里,通过bufio.NewReader(os.Stdin)

创建了一个buffer Reader,并联接到inputReader这个变量。

bufio.NewReader()函数原型为:

func NewReader(rd io.Reader) *Reader {
return NewReaderSize(rd, defaultBufSize)
}

任何符合io.Reader接口的对象法都可以作为bufio.NewReader()里的参数,并返回一个新的带缓冲的io.Reader,os.Stdin符合这个条件。这个带缓冲的Reader有一个方法ReadString(delim byte), 这个方法会一直读数据,直到遇到了指定的终止符(delim byte)才结束输入,终止符将成为输入的一部分,一起放到buffer里。

RearString()函数原型为:

func (b *Reader) ReadString(delim byte) (string, error) {
bytes, err := b.ReadBytes(delim)
return string(bytes), err
}

ReadString返回值是读到的字符串及nil。如果在读到结束时没有发现指定的结束符(delim byte),将返回一个 err != nil。在上面的例子中,我们从键盘输入直到键入“\n”才结束。屏幕是标准输出os.Stdout,错误信息被写到os.Stderr。大多情况下,os.Stderr等同os.Stdout。

一般情况下,在GO的代码里省略了变量声明,而直接使用”:=“进行自动类型推导,如:

inputReader := bufio.NewReader(os.Stdin)
input, err := inputReader.ReadString('\n')

总结

GO中Scan_或Sscan_系列函数与C中的scan_系统函数的用法相似,学过C的人可以很快学会这些函数的使用。但要实现带空格字符串的输入,则要使用bufio包里带缓冲的Reader和os包里的os.Stdin。


个人主页:

www.codeapes.cn

GO语言学习笔记1-输入带空格的字符串的更多相关文章

  1. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  2. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  3. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  4. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  5. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  6. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

  7. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  8. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

  9. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

随机推荐

  1. 自己用canvas写的贪吃蛇代码

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. python学习之模块-模块(三)

    5.6 time 模块 已经知道的常用的time方法:time.time()获取当前时间的时间戳:time.sleep(num)线程推迟指定的时间(秒)后再继续往下运行. 时间的表示方式 大致可以分为 ...

  3. 意想不到的JavaScript(每日一题1)

    问题: 答案: 解析:

  4. shell脚本4

    1.从FTP服务器下载文件 #!/bin/bash if [ $# -ne 1 ]; then echo "Usage: $0 filename" fi dir=$(dirname ...

  5. 【VS开发】文件夹和文件选择EditBrowe控件使用

    让EditBrowse控件既能浏览文件,又能浏览文件夹... 下图是在http://www.codeproject.com/Articles/35722/MFC-Feature-Pack-CMFCEd ...

  6. elementUI -->实现简单的购物车

    <template> <div class="bbb"> <el-checkbox :indeterminate="isIndetermin ...

  7. linux是什么与如何学习(三)

     1.1Linux是什么 Linux是在计算机上面运作的,所以说是一组软件. 1.2 Linux是什么?操作系统还是应用程序? 计算机主机是由一套硬件所组成的,为了有效的控制这些硬件资源,于是就有了操 ...

  8. CentOS7 linux系统多种方式安装ClickHouse数据库

    clickhouse是由俄罗斯Yandex公司开发的列式存储数据库,于2016年开源,clickhouse的定位是快速的数据分析,对于处理海量数据的情况性能非常好,在网上也有很多测试的案例,在大数据的 ...

  9. 直线的Bresenham算法

    在实验课上用自己的算法画直线被diss效率低 花了半天时间看了下Bresenham算法真

  10. fiddler 不能抓包解决

    早上使用金山毒霸扫描了一遍电脑,然后打开fiddler后,出现了一个提示(当时没有注意看),直接点了确定,导致结果是不能抓包了,百度了很多方法,最后直接卸载金山毒霸,然后将防火墙还原为默认设置(风险不 ...