Sto cercando l'equivalente Go di scanf(). Ho provato con seguente codice:Cercare l'equivalente di scanf
1 package main
2
3 import (
4 "scanner"
5 "os"
6 "fmt"
7)
8
9 func main() {
10 var s scanner.Scanner
11 s.Init(os.Stdin)
12 s.Mode = scanner.ScanInts
13 tok := s.Scan()
14 for tok != scanner.EOF {
15 fmt.Printf("%d ", tok)
16 tok = s.Scan()
17 }
18 fmt.Println()
19 }
lo eseguo con il contributo di un testo con una linea di numeri interi. Ma emette sempre -3 -3 ...
E come scansionare una linea composta da una stringa e alcuni interi? Cambiare la modalità ogni volta che si incontra un nuovo tipo di dati?
la documentazione del pacchetto:
scanner pacchetto
Uno scanner general-purpose per UTF-8 testo codificato.
Ma sembra che lo scanner non è per uso generale.
codice aggiornato:
func main() {
n := scanf()
fmt.Println(n)
fmt.Println(len(n))
}
func scanf() []int {
nums := new(vector.IntVector)
reader := bufio.NewReader(os.Stdin)
str, err := reader.ReadString('\n')
for err != os.EOF {
fields := strings.Fields(str)
for _, f := range fields {
i, _ := strconv.Atoi(f)
nums.Push(i)
}
str, err = reader.ReadString('\n')
}
r := make([]int, nums.Len())
for i := 0; i < nums.Len(); i++ {
r[i] = nums.At(i)
}
return r
}
Versione migliorata:
package main
import (
"bufio"
"os"
"io"
"fmt"
"strings"
"strconv"
"container/vector"
)
func main() {
n := fscanf(os.Stdin)
fmt.Println(len(n), n)
}
func fscanf(in io.Reader) []int {
var nums vector.IntVector
reader := bufio.NewReader(in)
str, err := reader.ReadString('\n')
for err != os.EOF {
fields := strings.Fields(str)
for _, f := range fields {
if i, err := strconv.Atoi(f); err == nil {
nums.Push(i)
}
}
str, err = reader.ReadString('\n')
}
return nums
}
Per ottenere risposte soddisfacenti, è necessario rispondere facilmente alle proprie domande. Ad esempio, codice che può essere facilmente copiato, incollato e compilato. Il compilatore Go non accetta i numeri di riga; non metterli nel codice di esempio. – peterSO
Forse questo non esisteva quando originariamente pubblicato, ma go ha fmt.Scanf che funziona proprio come C scanf ricevendo da stdin: var numero int fmt.Scanf ("% d", & number) – Myforwik
Oh mio Dio! Ho cercato per ore di ottenere un buon lettore da stdin. Amico, non riuscivo a capire come scriverlo. Grazie mille per aver postato il tuo codice –