c# 中如何从控制台的标准输入中读取数据?

我想从命令行读取标准输入,但在提示输入之前,我的尝试已经以程序退出而告终。我正在寻找c#中的等价Console.ReadLine ()

这是我目前拥有的:

package main


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


func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)


fmt.Println("Enter text: ")
text2 := ""
fmt.Scanln(text2)
fmt.Println(text2)


ln := ""
fmt.Sscanln("%v", ln)
fmt.Println(ln)
}
414547 次浏览

我不知道这个积木有什么问题

reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)

因为它在我的机器上工作。然而,对于下一个块,你需要一个指向你分配输入的变量的指针。尝试用fmt.Scanln(&text2)替换fmt.Scanln(text2)。不要使用Sscanln,因为它解析内存中已经存在的字符串,而不是来自stdin。如果你想做你想做的事情,用fmt.Scanf("%s", &ln)替换它

如果这仍然不能工作,你的罪魁祸首可能是一些奇怪的系统设置或有bug的IDE。

你不妨试试:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Println(scanner.Text())
}


if scanner.Err() != nil {
// Handle error.
}

我认为更标准的做法是:

package main


import "fmt"


func main() {
fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)
}

看一下scan godoc: http://godoc.org/fmt#Scan

扫描扫描从标准输入读取的文本,将连续的空格分隔值存储到连续的参数中。换行算作空格。

Scanln类似于Scan,但在换行处停止扫描,并且在最后一项之后必须有换行符或EOF。

清楚地读入两个提示值:

// Create a single reader which can be called multiple times
reader := bufio.NewReader(os.Stdin)
// Prompt and read
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Print("Enter More text: ")
text2, _ := reader.ReadString('\n')
// Trim whitespace and print
fmt.Printf("Text1: \"%s\", Text2: \"%s\"\n",
strings.TrimSpace(text), strings.TrimSpace(text2))

下面是一段:

Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"

另一种方法是在循环中读取多个输入,它可以处理带有空格的输入:

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


func main() {
scanner := bufio.NewScanner(os.Stdin)
var text string
for text != "q" {  // break the loop if text == "q"
fmt.Print("Enter your text: ")
scanner.Scan()
text = scanner.Text()
if text != "q" {
fmt.Println("Your text was: ", text)
}
}
}

输出:

Enter your text: Hello world!
Your text was:  Hello world!
Enter your text: Go is awesome!
Your text was:  Go is awesome!
Enter your text: q

试试下面的代码:

var input string
func main() {
fmt.Print("Enter Your Name=")
fmt.Scanf("%s", &input)
fmt.Println("Hello " + input)
}

你需要提供一个指向你想要扫描的变量的指针,如下所示:

fmt.scan(&text2)

总是尝试使用bufio。NewScanner从控制台收集输入。正如其他人所提到的,有多种方法可以完成这项工作,但Scanner最初的目的是完成这项工作。Dave Cheney解释了为什么你应该使用Scanner而不是bufio。读者的ReadLine。

https://twitter.com/davecheney/status/604837853344989184?lang=en

下面是回答您的问题的代码片段

package main


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


/*
Three ways of taking input
1. fmt.Scanln(&input)
2. reader.ReadString()
3. scanner.Scan()


Here we recommend using bufio.NewScanner
*/


func main() {
// To create dynamic array
arr := make([]string, 0)
scanner := bufio.NewScanner(os.Stdin)
for {
fmt.Print("Enter Text: ")
// Scans a line from Stdin(Console)
scanner.Scan()
// Holds the string that scanned
text := scanner.Text()
if len(text) != 0 {
fmt.Println(text)
arr = append(arr, text)
} else {
break
}


}
// Use collected inputs
fmt.Println(arr)
}

如果您不想以编程方式收集输入,只需添加这些行

   scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
text := scanner.Text()
fmt.Println(text)

以上程序的输出为:

Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]

上面的程序收集用户输入并将它们保存到一个数组中。我们也可以用一个特殊的角色打破这种流程。Scanner为高级用途提供API,如使用自定义函数进行分割等,扫描不同类型的I/O流(标准StdinString)等。

编辑:原始帖子中链接的推文无法访问。但是,你可以从这个标准库文档中找到使用Scanner的官方参考:https://pkg.go.dev/bufio@go1.17.6#example-Scanner-Lines

我迟到了。但是写一行怎么样:

data, err := ioutil.ReadAll(os.Stdin)

完成后按ctrl+d。

也可以这样做:

package main
import "fmt"


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

在我的例子中,程序没有等待,因为我正在使用watcher命令自动运行程序。手动运行程序go run main.go会导致“输入文本”;最终打印到控制台。

fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)

让我们做得很简单

s:=""
b := make([]byte, 1)
for os.Stdin.Read(b) ; b[0]!='\n'; os.Stdin.Read(b) {
s+=string(b)
}
fmt.Println(s)