2012-12-22 17 views
5

में fmt.Scanf का उपयोग कैसे करूं, मुझे लगता है कि एक लूप के अंदर उपयोगकर्ता इनपुट प्राप्त करते समय मुझे क्वियर समस्या हो रही है। यहाँ है मेरी codeमैं

package main 

import "fmt" 

func main() { 
    var num int 
    for i := 0; i < 10; i++ { 
     fmt.Printf("Debug: i : %d ", i) 
     fmt.Scanf("%d", &num) 
     fmt.Println(num) 
    } 
} 

क्या होता है जब मैं इस कोड को चलाने यह है:

Debug: i : 0 
Enter next number 
1 
1 
Debug: i : 1 
Enter next number 
1 
Debug: i : 2 
Enter next number 
2 
2 
Debug: i : 3 
Enter next number 
2 
Debug: i : 4 
Enter next number 
3 
3 
Debug: i : 5 
Enter next number 
3 
Debug: i : 6 
Enter next number 
4 
4 
Debug: i : 7 
Enter next number 
4 
Debug: i : 8 
Enter next number 
5 
5 
Debug: i : 9 
Enter next number 
5 

क्या मैं देखा कि पाश की प्रत्येक यात्रा दो बार होता है, इस वजह से हो सकता है जाओ समानांतरवाद का उपयोग कर रहा है डिफ़ॉल्ट रूप से और दोनों प्रोसेसर को लूप के भीतर कोड चलाने के लिए कारण बनता है?

+2

जहां तक ​​मैं देख सकता हूं, प्रत्येक पुनरावृत्ति केवल एक बार किया जाता है, 'डीबग: i: n' जहां 'n' 0 से 9 तक जाता है, ठीक उसी तरह से सुझाव देता है। या आप कुछ और मतलब है? टर्मिनल में मेरा सत्र यहां दिया गया है: https://gist.github.com/4357860 यह बिल्कुल अपेक्षित काम करता है। –

+2

आपका आउटपुट आपके कोड से मेल नहीं खाता है? – jdi

+0

@VladimirMatveev यदि आप इसे अपनी मशीन पर चलाने का प्रयास करते हैं, तो मुझे लगता है कि आप देखेंगे कि मेरा क्या मतलब है। क्या आप लूप में स्कैनफ देखते हैं? इसे 10 बार कीबोर्ड से एक मान पढ़ना चाहिए। लेकिन प्रत्येक इनपुट के लिए मैं देता हूं, लूप ब्लॉक दो बार निष्पादित करता है। तो मैं दो बार वृद्धि करता हूं। – gprasant

उत्तर

4

आप किस ओएस का उपयोग कर रहे हैं? विंडोज?

इस प्रयास करें:

package main 

import "fmt" 

func main() { 
    var num int 
    for i := 0; i < 10; i++ { 
     fmt.Printf("Debug: i : %d\n", i) 
     fmt.Println("Enter next number") 
     n, err := fmt.Scanf("%d\n", &num) 
     if err != nil { 
      fmt.Println(n, err) 
     } 
     fmt.Println(num) 
    } 
} 

आउटपुट:

Debug: i : 0 
Enter next number 
1 
1 
Debug: i : 1 
Enter next number 
2 
2 
Debug: i : 2 
Enter next number 
3 
3 
Debug: i : 3 
Enter next number 
4 
4 
Debug: i : 4 
Enter next number 
5 
5 
Debug: i : 5 
Enter next number 
6 
6 
Debug: i : 6 
Enter next number 
7 
7 
Debug: i : 7 
Enter next number 
8 
8 
Debug: i : 8 
Enter next number 
9 
9 
Debug: i : 9 
Enter next number 
10 
10 
+0

मैं। मैंने आपके सुझाव की कोशिश की। मुझे अभी भी एक ही समस्या है – gprasant

+0

मुझे खेद है, मैंने 'fmt.Scanf ("% d \ n ", और num) में '\ n' को हटा दिया। मैंने scanfwith \ n की कोशिश की और यह – gprasant

2

ऊपर जवाब एक अच्छा सुझाव है। कोड

if err != nil { 
     fmt.Println(n, err) 
    } 

इस समस्या का कारण आउटपुट करेगा।

10 unexpected newline 

तो मैं इस पर कोड बदलता हूं, और यह काम करता है।

package main 

import "fmt" 

func main() { 
    var num int 
    for i := 0; i < 10; i++ { 
     fmt.Printf("Debug: i : %d ", i) 
     fmt.Scanf("%d\n", &num) // add "\n" 
     fmt.Println(num) 
    } 
} 

यह विभिन्न पंक्ति समाप्ति के कारण है। खिड़कियां अंतराल के रूप में कैरिज रिटर्न और लाइन फीड (\r\n) का उपयोग करती हैं। यूनिक्स लाइन फीड का उपयोग करता है (\n)।

आप notepad2 का उपयोग \r लाइन फ़ीड के साथ फ़ाइल (a.txt) बनाने के लिए कर सकते हैं। और ऐसा करते हैं:

go run s.go < input.txt 

इस सही ढंग से काम करेंगे।

+0

काम किया यह स्कैनफ़ में अनुपस्थित '\ n' के साथ एक समस्या थी। क्या यह एक विंडोज़ लाइन समस्या को खत्म कर रहा है? क्योंकि मैंने एक दोस्त के मैक पर ऊपर एक ही कोड चलाया और यह पूरी तरह से – gprasant

+1

काम करता है यह विभिन्न पंक्ति समाप्ति के कारण है। खिड़कियां अंतराल के रूप में कैरिज रिटर्न और लाइन फीड ('\ r \ n') का उपयोग करती हैं। यूनिक्स लाइन फीड ('\ n') का उपयोग करता है। – pexeer

1

fmt.Scanln (& संख्या) का कहना है के लिए शायद fmt.Scanf ("% d \ n", & संख्या), fmt.Scanln के बाद से (& संख्या) के रूप में ही काम करेगा भी "के प्रकार की जाँच बस संख्या "।

दूसरे शब्दों में, अगर

var num float32 

fmt.Scanln(&num) 

आप कंसोल से चल संख्या इनपुट कर सकते हैं।