Чтение целого числа из стандартного ввода

85

Как использовать fmt.Scanfфункцию в Go, чтобы получить целочисленный ввод из стандартного ввода?

Если это невозможно сделать с помощью fmt.Scanf, как лучше всего прочитать одно целое число?

ясит
источник

Ответы:

132

http://golang.org/pkg/fmt/#Scanf

Все библиотеки, включенные в Go, хорошо документированы.

При этом я верю

func main() {
    var i int
    _, err := fmt.Scanf("%d", &i)
}

трюк

cthom06
источник
fmt.Scanf потребовалось около минуты для сканирования 1 миллиона целых чисел.
Роберт Кинг
@robertking попробуйте вместо этого использовать bufio. Это простой пример.
cthom06 07
Ура. Буфио быстр.
Роберт Кинг
5
Вы можете объяснить, почему мы должны входить, &iа не просто iтак fmt.Printf("%v", i)?
Zeynel
6
@Zeynel Потому что параметры в Go передаются по значению. i- это просто целое число в i, &iэто указатель на i.
cthom06 05
48

Альтернатива, которая может быть немного более краткой, - просто использовать fmt.Scan:

package main

import "fmt"

func main() {
    var i int
    fmt.Scan(&i)
    fmt.Println("read number", i, "from stdin")
}

При этом используется отражение типа аргумента, чтобы определить, как следует анализировать ввод.

http://golang.org/pkg/fmt/#Scan

iainmcgin
источник
4

Вот мой метод "быстрого ввода-вывода" для чтения положительных целых чисел. Его можно улучшить с помощью сдвига битов и предварительной разметки памяти.

package main

import (
    "io/ioutil"
    "bufio"
    "os"
    "strconv"
)


func main() {
    out := bufio.NewWriter(os.Stdout)
    ints := getInts()
    var T int64
    T, ints = ints[0], ints[1:]
    ..
    out.WriteString(strconv.Itoa(my_num) + "\n")
    out.Flush()
    }
}

func getInts() []int64 {
    //assumes POSITIVE INTEGERS. Check v for '-' if you have negative.
    var buf []byte
    buf, _ = ioutil.ReadAll(os.Stdin)
    var ints []int64
    num := int64(0)
    found := false
    for _, v := range buf {
        if '0' <= v && v <= '9' {
            num = 10*num + int64(v - '0') //could use bitshifting here.
            found = true
        } else if found {
            ints = append(ints, num)
            found = false
            num = 0
        }
    }
    if found {
        ints = append(ints, num)
        found = false
        num = 0
    }
    return ints
}
Роберт Кинг
источник
3

Golang fmt.Scan проще, чем Golang fmt.Scanf (который проще, чем Clang scanf)

Если fmt.Scan ошибки, т.е. если не nil, записать и вернуть

1 Прочтите единственную переменную:

import (
    "fmt"
    "log"
)

var i int
if    _, err := fmt.Scan(&i);    err != nil {
    log.Print("  Scan for i failed, due to ", err)
    return
}

fmt.Println(i)

2 Прочтите несколько переменных:

import (
    "fmt"
    "log"
)

var i, j, k int  
if    _, err := fmt.Scan(&i, &j, &k);    err != nil {
    log.Print("  Scan for i, j & k failed, due to ", err)
    return
}

fmt.Println(i, j, k)

Удачи

Пример из: http://www.sortedinf.com/?q=golang-in-1-hour

Манохар Редди Поредди
источник
0

Вы можете использовать fmt.Scanfсо спецификатором формата. Спецификатор формата для целого числа -% d. Таким образом, вы можете использовать стандартный ввод, как показано ниже.

func main() {
    var someVar int
    fmt.Scanf("%d", &someVar)
}

Или вы можете использовать fmt.Scanили, fmt.Scanlnкак показано ниже.

func main() {
   var someVar int
   fmt.Scanln(&someVar)
}
Кавин Гиацинт
источник