V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whoami9894
V2EX  ›  程序员

go 和 c 的 scanf 函数

  •  
  •   whoami9894 · 2018-09-21 23:50:03 +08:00 · 2596 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天发现 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?

    14 条回复    2023-02-07 03:11:40 +08:00
    wdlth
        1
    wdlth  
       2018-09-22 00:14:51 +08:00
    在 REPL 试了一下,没出现你说的 Go 的情况,可以输入两个数。
    donething
        2
    donething  
       2018-09-22 00:20:01 +08:00
    需要输入整数,你可能输入了其它字符
    bequt
        3
    bequt  
       2018-09-22 00:44:50 +08:00 via Android
    每次输入数应该按回车
    misaka19000
        4
    misaka19000  
       2018-09-22 00:46:28 +08:00
    我也试了一下,没遇到楼主所说的情况
    airdge
        5
    airdge  
       2018-09-22 11:58:52 +08:00
    同样输出正常
    whoami9894
        6
    whoami9894  
    OP
       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
        7
    petelin  
       2018-09-23 09:20:41 +08:00 via Android
    神奇
    petelin
        8
    petelin  
       2018-09-23 09:21:14 +08:00 via Android
    要不你编译个 macos 版本的放上来我跑一下
    AlisaDestiny
        9
    AlisaDestiny  
       2018-09-23 12:04:06 +08:00
    大惊小怪。你的 go 还可以输入一个 a.我的没给我输入的机会。
    https://i.loli.net/2018/09/23/5ba71034b5633.gif
    AlisaDestiny
        10
    AlisaDestiny  
       2018-09-23 12:17:04 +08:00
    上面程序我打错了。
    改正后和楼主一样。只输入一个 1 就退出了。
    AlisaDestiny
        11
    AlisaDestiny  
       2018-09-23 12:42:12 +08:00
    我查了下。可能是因为 window 下的回车是\r\n 的问题。所以他们 linux 下测试的是正常的。
    https://segmentfault.com/q/1010000000369967#a-1020000000370103
    yulon
        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。
    goofool
        13
    goofool  
       2018-09-23 20:04:46 +08:00 via Android
    Dvel
        14
    Dvel  
       2023-02-07 03:11:40 +08:00
    我日,这么多年了还没修复吗???
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1060 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:35 · PVG 02:35 · LAX 10:35 · JFK 13:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.