2012-12-22 124 views
5

在for循环中获取用户输入时,我似乎遇到了一个奇怪的问题。 这里是我的code如何在Go中使用fmt.Scanf

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 

我注意到的是,每次循环发生两次,难道这是因为围棋是采用并行默认情况下,并导致两个处理器在for循环内运行代码?

+2

据我所知,每次迭代只进行一次,'Debug:i:n'其中'n'从0到9暗示了这一点。或者你的意思是别的吗?这是我在终端中的会话:https://gist.github.com/4357860它完全按照预期工作。 –

+2

你的输出如何与你的代码不匹配? – jdi

+0

@VladimirMatveev如果你试图在你的机器上运行它,我想你会明白我的意思。你看到循环中的scanf吗?它应该从键盘读取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

我正在使用Windows。我尝试了你的建议。我仍然有同样的问题 – gprasant

+0

对不起,我在fmt.Scanf(“%d \ n”,#)''中排除了'\ 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)作为行结束。 Unix使用换行符(\n)。

您可以使用notepad2创建一个带有\r换行符的文件(a.txt)。 并执行此操作:

go run s.go < input.txt 

这会正常工作。

+0

这是scanf中缺乏'\ n'的问题。这是一个Windows线结束的问题?因为我在朋友的mac上运行了上面的相同代码,并且它的运行效果很好 – gprasant

+1

这是因为不同的行结尾。窗口使用回车符和换行符('\ r \ n')作为行尾。 Unix使用换行('\ n')。 – pexeer

1

只是想指出fmt.Scanln(& NUM)可能会工作一样fmt.Scanf( “%d \ n”,& NUM),因为fmt.Scanln(& NUM)也检查“类型NUM”。

换句话说,从控制台如果

var num float32 

fmt.Scanln(&num) 

你可以输入浮点数。