我尝试通过scanner.Bytes
快速输入,并且我转换为int。问题是:提供的输入是单行间隔元素(如数组),scanner.Bytes
将其作为一个整体读取并将其转换为int。如何在读取的字节上使用Split功能!
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
}
答案 0 :(得分:2)
默认的bufio.Scanner
(使用默认的拆分功能)将输入分为线路终端剥离的行。如果要将输入分解为单词,则必须使用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
值,表示扫描是否成功,您可以处理令牌。您应该使用此返回值,而不是依赖于用户输入有效数据。
答案 1 :(得分:1)
为什么不尝试像
这样的东西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)
}
}
答案 2 :(得分:1)
假设输入为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]
。