go 和 c 的 scanf 函数

2018-09-21 23:50:03 +08:00
 whoami9894

今天发现 Go 的scanf函数和 C 的scanf函数的一点奇怪小不同

package main

import "fmt"

func main() {
	var a int
	var b int
	fmt.Scanf("%d", &a)
	fmt.Scanf("%d", &b)
	fmt.Printf("%d  %d", a, b)
}
#include <stdio.h>

int main(){
	int a;
	int b;
	scanf("%d", &a);
	scanf("%d", &b);
	printf("%d  %d", a, b);
}

Golang 里:输入第一个数 1 后程序退出,输出 1,0

C 里:正常输入两个数退出

why?

2541 次点击
所在节点    程序员
14 条回复
wdlth
2018-09-22 00:14:51 +08:00
在 REPL 试了一下,没出现你说的 Go 的情况,可以输入两个数。
donething
2018-09-22 00:20:01 +08:00
需要输入整数,你可能输入了其它字符
bequt
2018-09-22 00:44:50 +08:00
每次输入数应该按回车
misaka19000
2018-09-22 00:46:28 +08:00
我也试了一下,没遇到楼主所说的情况
airdge
2018-09-22 11:58:52 +08:00
同样输出正常
whoami9894
2018-09-22 12:59:50 +08:00
@wdlth
@donething
@bequt
@misaka19000
@airdge

真的很神奇了....

!( https://imgur.com/a/RQsNdkP)[https://imgur.com/a/RQsNdkP]

go version go1.9.2 windows/amd64
petelin
2018-09-23 09:20:41 +08:00
神奇
petelin
2018-09-23 09:21:14 +08:00
要不你编译个 macos 版本的放上来我跑一下
AlisaDestiny
2018-09-23 12:04:06 +08:00
大惊小怪。你的 go 还可以输入一个 a.我的没给我输入的机会。
https://i.loli.net/2018/09/23/5ba71034b5633.gif
AlisaDestiny
2018-09-23 12:17:04 +08:00
上面程序我打错了。
改正后和楼主一样。只输入一个 1 就退出了。
AlisaDestiny
2018-09-23 12:42:12 +08:00
我查了下。可能是因为 window 下的回车是\r\n 的问题。所以他们 linux 下测试的是正常的。
https://segmentfault.com/q/1010000000369967#a-1020000000370103
yulon
2018-09-23 16:06:55 +08:00
C 标准对于标准输出的格式有规定,换行只能是 LF,而 Windows 是 CRLF,所以 C 标准库在实现的时候都会自行转换下,stdin 会把 CRLF 转换成 LF,而 stdout/stderr 会把 LF 转换成 CRLF,只有在用 Win32 API GetStdHandle 时得到的读写流才是原始不会被转换的,而 Go 用的就是原始流,但是 Go 对换行的处理又是遵循 C 或者说是 Unix 只有一个 LF 的,你如果做个捕获程序就会发现 Go 程序只会输出 LF,而这在 Windows 下其实是不太合法的,虽然控制台可以显示你换行了,但还是可能造就一些 bug。

综上所述,你第二个 fmt.Scanf 捕获到的应该是 CR。
goofool
2018-09-23 20:04:46 +08:00
Dvel
2023-02-07 03:11:40 +08:00
我日,这么多年了还没修复吗???

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/491689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX