英文:
golang scan a line of numbers from sdin
问题
我正在尝试从标准输入中读取输入,并将其保存在一个整数列表中。目前我的代码如下:
nums := make([]int, 0)
var i int
for {
_, err := fmt.Scan(&i)
if err != nil {
if err == io.EOF {
break
}
log.Fatal(err)
}
nums = append(nums, i)
}
目前程序无法跳出循环。我在文档中找不到检查换行符的简单方法。我该如何做呢?
编辑:
由于我知道几乎肯定会有四个数字,我尝试了以下代码:
var i0, i1, i2, i3 int
fmt.Scanf("%d %d %d %d\n", &i0, &i1, &i2, &i3)
但这只会扫描第一个数字,然后退出程序。我不确定这是否是因为我使用的是z-shell。
编辑:
为了澄清,程序将暂停并要求用户输入由空格分隔并以换行符终止的n个数字的列表。这些数字应该存储在一个数组中。
英文:
I'm trying to read input from stdin like
3 2 1<ENTER>
and save it in a list of ints. At the moment my code looks like this:
nums = make([]int, 0)
var i int
for {
_, err := fmt.Scan(&i)
if err != nil {
if err==io.EOF { break }
log.Fatal(err)
}
nums = append(nums, i)
}
at the moment the program never leaves the for-loop. I can't find an easy way to check for a newline character in the documentation. how would i do this?
Edit:
Since I know that there will almost certainly be four numbers, I tried the following:
var i0,i1,i2,i3 int
fmt.Scanf("%d %d %d %d\n", &i0, &i1, &i2, &i3)
but this only scanned the first number and then exited the program. I'm not sure if that's because of the z-shell I'm using.
Edit:
To clarify, the program will pause and ask for the user to input a list of n numbers separated by spaces and terminated with a newline. these numbers should be stored in an array.
答案1
得分: 5
好的,以下是翻译好的代码部分:
in := bufio.NewReader(os.Stdin)
line, err := in.ReadString('\n')
if err != nil {
log.Fatal(err)
}
strs := strings.Split(line[0:len(line)-1], " ")
nums := make([]int, len(strs))
for i, str := range strs {
if nums[i], err = strconv.Atoi(str); err != nil {
log.Fatal(err)
}
}
这段代码看起来确实有点冗长,但它是有效的。
英文:
Ok, I decided to bring out the large bufio hammer and solve it like this:
in := bufio.NewReader(os.Stdin)
line, err := in.ReadString('\n')
if err != nil {
log.Fatal(err)
}
strs := strings.Split(line[0:len(line)-1], " ")
nums := make([]int, len(strs))
for i, str := range strs {
if nums[i], err = strconv.Atoi(str); err != nil {
log.Fatal(err)
}
}
It does seem like an awful lot of code, but it works.
答案2
得分: 2
看起来你想要翻译的内容是关于使用Go语言中的fmt.Fscanln
函数的代码示例。以下是翻译好的内容:
似乎你想要使用https://golang.org/pkg/fmt/#Fscanln
类似于
ok := func(err error) { if err != nil { panic(err) } }
for {
var i, j, k int
_, err := fmt.Fscanln(io.Stdin, &i, &j, &k)
ok(err)
fmt.Println(i, j, k)
}
英文:
It seems that you want https://golang.org/pkg/fmt/#Fscanln
Something like
ok := func(err error) { if err != nil { panic(err) } }
for {
var i, j, k int
_, err := fmt.Fscanln(io.Stdin, &i, &j, &k)
ok(err)
fmt.Println(i, j, k)
}
答案3
得分: 1
我建议使用"bufio"包和"scan()"方法。
以下是我从"stdin"读取两行并将其存储到数组中的代码。
希望这对你有帮助。
package main
import (
"fmt"
"bufio"
"os"
"strconv"
"strings"
)
func ReadInput() []string {
var lines []string
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
lines = append(lines, scanner.Text())
if len(lines) == 2 {
break
}
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
return lines
}
func main() {
lines := ReadInput()
count, _ := strconv.Atoi(lines[0])
num := strings.Fields(lines[1])
if count != len(num) {
os.Exit(0)
}
// 在这里做你想做的事情
}
将接受两行输入。第一行是计数,第二行是所有的数字。你可以根据需要修改相同的代码。
示例:
3
1 5 10
英文:
I will suggest to use "bufio" package with the "scan()" method.
Following is the code where I'm reading two lines from "stdin" and storing the lines into an array.
Hope this helps you.
package main
import (
"fmt"
"bufio"
"os"
"strconv"
"strings"
)
func ReadInput() []string{
var lines []string
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
lines = append(lines, scanner.Text())
//count, _ := strconv.Atoi(lines[0])
if len(lines) == 2 { break }
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, err)
}
return lines
}
func main(){
lines := ReadInput()
count ,_ := strconv.Atoi(lines[0])
num := strings.Fields(lines[1])
if count != len(num) { os.Exit(0) }
// Do whatever you want here
}
Two lines will be accepted. First line will have a count. Second line will have all the numbers. You can modify the same code as per your requirement.
Example:
3
1 5 10
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论