Зчитування цілого числа зі стандартного вводу


85

Як я можу використовувати fmt.Scanfфункцію в Go, щоб отримати ціле введення зі стандартного вводу?

Якщо цього неможливо зробити fmt.Scanf, який найкращий спосіб прочитати одне ціле число?

Відповіді:


132

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

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

Я вважаю, що це сказано

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

робить трюк


fmt.Scanf зайняв близько хвилини, щоб просканувати 1 мільйон цілих чисел.
Роберт Кінг

@robertking спробуйте використовувати замість цього bufio Це простий приклад.
cthom06

Ура. Буфіо швидкий.
Роберт Кінг

5
Чи можете ви пояснити, чому ми повинні увійти, &iа не просто так, iяк fmt.Printf("%v", i)?
Zeynel

6
@Zeynel Оскільки параметри передаються за значенням у Go. i- це просто ціле значення в i, &iє вказівником на i.
cthom06,

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


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, тобто якщо немає нуля, увійдіть і поверніться

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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.