How to use fmt.scanln read from a string separated

2019-05-22 19:50发布

问题:

Want "30 of month" but get "30"

package main

import "fmt"

func main() {
    var s string
    fmt.Scanln(&s)
    fmt.Println(s)
    return
}

$ go run test.go
31 of month
31

Scanln is similar to Scan, but stops scanning at a newline and after the final item there must be a newline or EOF.

回答1:

The fmt Scan family scan space-separated tokens.

package main

import (
    "fmt"
)

func main() {
    var s1 string
    var s2 string
    fmt.Scanln(&s1,&s2)
    fmt.Println(s1)
    fmt.Println(s2)
    return
}

You can try bufio scan

package main
import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        s := scanner.Text()
        fmt.Println(s)
    }
    if err := scanner.Err(); err != nil {
        os.Exit(1)
    }
}


回答2:

If you really want to include the spaces, you may consider using fmt.Scanf() with format %q a double-quoted string safely escaped with Go syntax , for example:

package main

import "fmt"

func main() {
    var s string
    fmt.Scanf("%q", &s)
    fmt.Println(s)
    return
}

Run it and:

$ go run test.go
"31 of month"
31 of month


回答3:

Here is the working program

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    var strInput, strInputLowerCase string
    var bFindI, bFindN, bFindA bool

    fmt.Println("Enter a string ")

    scanner := bufio.NewScanner(os.Stdin)
    if scanner.Scan() {
        strInput = scanner.Text()

    }
    fmt.Println(strInput)

}

which reads strings like " d skd a efju N" and prints the same string as output.



标签: string input go