[英]Fast method to take input separated by space [Golang]
我正在尝试通过scanner.Bytes
快速输入,然后将其转换为int。 问题是:提供的输入是由单行分隔的元素(例如数组)和scanner.Bytes
将其整体读取并将其转换为int。 如何对读取的字节使用拆分功能!
func main() {
scanner := bufio.NewScanner(os.Stdin)
var t int
fmt.Scanf("%d", &t)
for o := 0; o < t; o++ {
scanner.Scan()
//scanner.Split(bufio.ScanWords())
val := toInt(scanner.Bytes())
fmt.Println(val)
}
}
func toInt(buf []byte) (n int) {
for _, v := range buf {
n = n*10 + int(v-'0')
}
return
}
默认的bufio.Scanner
(具有默认的split功能)将输入分成几行,剥去了行终端。 如果要将输入分解为单词,则必须使用Scanner.Split()
方法设置其他拆分功能。
有一个现成的拆分函数可用于拆分单词: bufio.ScanWords()
。 我们可以在您的代码中看到此函数的注释。
但是要知道Scanner.Split()
方法需要一个函数值 。 您不需要调用split函数,扫描仪将调用它来中断输入数据。 您只需要传递函数值即可,而无需调用它,也不必在函数名称后附加()
,例如:
scanner.Split(bufio.ScanWords)
还要注意,在开始扫描输入之前,您只需要执行一次,并且只能执行一次,因此请将此行移至for
循环上方:
var t int
fmt.Scanf("%d", &t)
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
for o := 0; o < t; o++ {
scanner.Scan()
val := toInt(scanner.Bytes())
fmt.Println(val)
}
现在运行该应用程序,并输入以下行:
3
1 2 3
输出将是:
1
2
3
还要注意, Scanner.Scan()
返回一个bool
值,指示扫描是否成功,您可以处理令牌。 您应该使用此返回值,而不要依赖用户输入有效数据。
为什么不尝试像
func main() {
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
val, err := strconv.Atoi(scanner.Text())
if err != nil {
log.Fatal(err)
}
fmt.Println(val)
}
}
假设输入是3 65 65 65
而3
是以下字节数,则可以这样做:
func main() {
var t int
fmt.Scanf("%d", &t)
values := make([]byte, t)
buf := make([]interface{}, t)
for i := 0; i < t; i++ {
buf[i] = &values[i]
}
fmt.Scanln(buf...)
// test
fmt.Printf("%v\n", values)
}
测试输出为[65 65 65]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.