英文:
How do I use fmt.Scanf in Go
问题
我在使用Go语言的for循环获取用户输入时遇到了一个奇怪的问题。当我运行这段代码时,发生了以下情况:
每次循环迭代都会发生两次,这可能是因为Go默认使用并行处理,导致两个处理器同时运行for循环中的代码吗?
英文:
I seem to be having a queer problem while getting user input within a for loop in go.
Here is my 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)
}
}
What happens when I run this code is this :
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
What I notice is that each iteration of the loop happens twice, Could this be because Go is using parallelism by default and causing both processors to run the code within a for loop?
答案1
得分: 5
尝试这个:
package main
import "fmt"
func main() {
var num int
for i := 0; i < 10; i++ {
fmt.Printf("调试: i : %d\n", i)
fmt.Println("输入下一个数字")
n, err := fmt.Scanf("%d\n", &num)
if err != nil {
fmt.Println(n, err)
}
fmt.Println(num)
}
}
输出:
调试: i : 0
输入下一个数字
1
1
调试: i : 1
输入下一个数字
2
2
调试: i : 2
输入下一个数字
3
3
调试: i : 3
输入下一个数字
4
4
调试: i : 4
输入下一个数字
5
5
调试: i : 5
输入下一个数字
6
6
调试: i : 6
输入下一个数字
7
7
调试: i : 7
输入下一个数字
8
8
调试: i : 8
输入下一个数字
9
9
调试: i : 9
输入下一个数字
10
10
英文:
What OS are you using? Windows?
Try this:
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)
}
}
Output:
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
答案2
得分: 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) // 添加 "\n"
fmt.Println(num)
}
}
这是因为不同的行尾符。Windows 使用回车和换行符(\r\n
)作为行尾符。Unix 使用换行符(\n
)。
你可以使用 notepad2 创建一个带有 \r
行尾符的文件(a.txt)。
然后执行以下命令:
go run s.go < input.txt
这将正常工作。
英文:
The above answer is a good suggestion.
the code
if err != nil {
fmt.Println(n, err)
}
will output the reason of this problem.
10 unexpected newline
So I change the code to this, and it works.
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)
}
}
this is because of the different line endings. the windows uses carriage return and line feed(\r\n
) as a line ending. the Unix uses the line feed(\n
).
you can use notepad2 to create a file (a.txt) with \r
line feed.
and do this:
go run s.go < input.txt
this will work correctly.
答案3
得分: 1
只是指出 fmt.Scanln(&num) 可能与 fmt.Scanf("%d\n",&num) 的效果相同,因为 fmt.Scanln(&num) 也会检查 "num" 的类型。
换句话说,如果
var num float32
fmt.Scanln(&num)
你可以从控制台输入浮点数。
英文:
Just to point out fmt.Scanln(&num) would probably work the same as fmt.Scanf("%d\n",&num), since fmt.Scanln(&num) also check the type of "num".
In other words, if
var num float32
fmt.Scanln(&num)
you can input floating number from the console.
答案4
得分: 0
我有同样的问题,我解决了在scanf格式字符串中添加"\n":
fmt.Scanf("%d\n", &num)。
英文:
I have the same problem, i resolved adding "\n" in a scanf format string:
fmt.Scanf("%d\n", &num).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论