Go

2012-12-22 21 views
5

içinde fmt.Scanf öğesini nasıl kullanırım? Gitmede bir döngü içinde kullanıcı girdisi alırken bir queer sorunu yaşıyorum. İşte benim codeGo

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

Ne bu kodu çalıştırdığınızda olur şudur:

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 

Ne fark döngünün her yineleme Git paralelliği kullanarak çünkü bu olabilir, iki kere olur olmasıdır varsayılan olarak ve her iki işlemcinin kodu bir for döngüsü içinde çalıştırmasına neden oluyor?

+2

Görebildiğim kadarıyla, her yineleme yalnızca bir kez yapılır, 'Debug: i: n' burada' n' 0'dan 9'a gider. Yoksa başka bir şey mi demek istiyorsun? İşte terminaldeki oturumum: https://gist.github.com/4357860 Tam olarak beklendiği gibi çalışır. –

+2

Çıktınız kodunuza uymuyor mu? – jdi

+0

@VladimirMatveev Makinenizde çalıştırmayı denerseniz, ne demek istediğimi göreceksiniz. Scanf'i döngüde görüyor musunuz? Klavyeden 10 kez bir değer okumalıdır. Fakat verdiğim her giriş için, döngü bloğu iki kez yürütülür. Yani iki kere artırıyorum. – gprasant

cevap

4

Hangi İşletim Sistemini kullanıyorsunuz? Windows®

bu deneyin:

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

Çıktı:

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

Pencereleri kullanıyorum. Önerinizi denedim. Ben hala aynı sorunu yaşıyorum – gprasant

+0

Üzgünüm, fmt.Scanf ("% d \ n", & num) 'içinde '\ n' dışarı ortalanmış. Scanfwith \ n'yi denedim ve – gprasant

2

yukarıdaki cevabı iyi bir öneridir. kod

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

irade çıktı bu sorunun nedeni.

10 unexpected newline 

Bu yüzden bu kodu değiştirdim ve çalışır. Bu, farklı satır sonları nedeniyle, bunun nedeni bu Pencereler satır sonu olarak satır başı ve satır beslemesini (\r\n) kullanır. Unix, satır beslemesini kullanır (\n).

\r satır beslemeli bir dosya (a.txt) oluşturmak için notepad2'u kullanabilirsiniz. ve bunu:

go run s.go < input.txt 

bu düzgün çalışacaktır.

+0

çalıştı, scanf'de '\ n' eksikliğiyle ilgili bir sorun oldu. Bu bir windows çizgi sonu problemi mi? Çünkü aynı kodu bir arkadaşımın Mac'inde çalıştırdım ve – gprasant

+1

mükemmel çalıştı, çünkü bu farklı satır sonları. Pencereler satır sonu olarak satır başı ve satır besleme ('\ r \ n') kullanır. Unix, satır beslemesini kullanır ('\ n'). – pexeer

1

Hemen da "türünü kontrol muhtemelen fmt.Scanf ("% d \ n", & num), fmt.Scanln beri (& num) ile aynı çalışacak fmt.Scanln (& num) işaret etmek num". Eğer giriş konsoldan numarayı yüzer yapabilirsiniz

var num float32 

fmt.Scanln(&num) 

Başka bir deyişle

.