it-swarm.asia

كيفية قراءة المدخلات من خط وحدة التحكم؟

أرغب في قراءة الإدخال من سطر الأوامر ، لكن محاولاتي انتهت مع إنهاء البرنامج قبل مطالبتي بالإدخال. أنا أبحث عن ما يعادل Console.ReadLine () في C #.

هذا ما لدي حاليا:

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)
}
215
Dante

لست متأكدا ما هو الخطأ في الكتلة

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)

إذا لم يفلح ذلك ، فقد يكون الجاني هو بعض إعدادات النظام الغريبة أو IDE عربات التي تجرها الدواب.

233
LinearZoetrope

يمكنك أيضًا تجربة:

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

if scanner.Err() != nil {
    // handle error.
}
101
Helin Wang

أعتقد أن الطريقة الأكثر القياسية للقيام بذلك هي:

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 المسح الضوئي ، ولكنه يتوقف عن المسح في سطر جديد وبعد العنصر الأخير يجب أن يكون هناك سطر جديد أو EOF.

76
Pith

حاول دائمًا استخدام bufio.NewScanner لجمع المدخلات من وحدة التحكم. كما ذكر الآخرون ، هناك طرق متعددة للقيام بالمهمة ولكن المقصود في الأصل Scanner للقيام بهذه المهمة. يشرح ديف تشيني سبب وجوب استخدام الماسح الضوئي بدلاً من bufio.Reader ReadLine.

https://Twitter.com/davecheney/status/604837853344989184؟lang=ar

فيما يلي إجابة مقتطف الشفرة لسؤالك

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 واجهة برمجة التطبيقات للاستخدام المتطور مثل التقسيم باستخدام وظيفة مخصصة وما إلى ذلك ، ومسح أنواع مختلفة من تدفقات الإدخال/الإخراج (Stdin ، String) إلخ.

9
Naren Yellavula

هناك طريقة أخرى لقراءة مدخلات متعددة داخل حلقة يمكنها التعامل مع إدخال بمسافات:

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
9
Chiheb Nexus

جرب هذا الكود: -

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

أنا متأخرا للحفل. ولكن ماذا عن بطانة واحدة:

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

يمكن القيام به مثل هذا: -

package main
import "fmt"     

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

قراءة نظيفة في بضع القيم دفعت:

// 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"
2
Rohanthewiz

تحتاج إلى توفير مؤشر للمتغير الذي تريد مسحه ، مثل:

fmt.scan(&text2)
0
Liam Mertens