今天发现 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?
1
wdlth 2018-09-22 00:14:51 +08:00
在 REPL 试了一下,没出现你说的 Go 的情况,可以输入两个数。
|
2
donething 2018-09-22 00:20:01 +08:00
需要输入整数,你可能输入了其它字符
|
3
bequt 2018-09-22 00:44:50 +08:00 via Android
每次输入数应该按回车
|
4
misaka19000 2018-09-22 00:46:28 +08:00
我也试了一下,没遇到楼主所说的情况
|
5
airdge 2018-09-22 11:58:52 +08:00
同样输出正常
|
6
whoami9894 OP @wdlth
@donething @bequt @misaka19000 @airdge 真的很神奇了.... !( https://imgur.com/a/RQsNdkP)[https://imgur.com/a/RQsNdkP] go version go1.9.2 windows/amd64 |
7
petelin 2018-09-23 09:20:41 +08:00 via Android
神奇
|
8
petelin 2018-09-23 09:21:14 +08:00 via Android
要不你编译个 macos 版本的放上来我跑一下
|
9
AlisaDestiny 2018-09-23 12:04:06 +08:00
大惊小怪。你的 go 还可以输入一个 a.我的没给我输入的机会。
https://i.loli.net/2018/09/23/5ba71034b5633.gif |
10
AlisaDestiny 2018-09-23 12:17:04 +08:00
上面程序我打错了。
改正后和楼主一样。只输入一个 1 就退出了。 |
11
AlisaDestiny 2018-09-23 12:42:12 +08:00
我查了下。可能是因为 window 下的回车是\r\n 的问题。所以他们 linux 下测试的是正常的。
https://segmentfault.com/q/1010000000369967#a-1020000000370103 |
12
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。 |
13
goofool 2018-09-23 20:04:46 +08:00 via Android
|
14
Dvel 2023-02-07 03:11:40 +08:00
我日,这么多年了还没修复吗???
|