V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
whoami9894
V2EX  ›  程序员

go 和 c 的 scanf 函数

  •  
  •   whoami9894 · Sep 21, 2018 · 3024 views
    This topic created in 2783 days ago, the information mentioned may be changed or developed.

    今天发现 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 replies    2023-02-07 03:11:40 +08:00
    wdlth
        1
    wdlth  
       Sep 22, 2018
    在 REPL 试了一下,没出现你说的 Go 的情况,可以输入两个数。
    donething
        2
    donething  
       Sep 22, 2018
    需要输入整数,你可能输入了其它字符
    bequt
        3
    bequt  
       Sep 22, 2018 via Android
    每次输入数应该按回车
    misaka19000
        4
    misaka19000  
       Sep 22, 2018
    我也试了一下,没遇到楼主所说的情况
    airdge
        5
    airdge  
       Sep 22, 2018
    同样输出正常
    whoami9894
        6
    whoami9894  
    OP
       Sep 22, 2018
    @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  
       Sep 23, 2018 via Android
    神奇
    petelin
        8
    petelin  
       Sep 23, 2018 via Android
    要不你编译个 macos 版本的放上来我跑一下
    AlisaDestiny
        9
    AlisaDestiny  
       Sep 23, 2018
    大惊小怪。你的 go 还可以输入一个 a.我的没给我输入的机会。
    https://i.loli.net/2018/09/23/5ba71034b5633.gif
    AlisaDestiny
        10
    AlisaDestiny  
       Sep 23, 2018
    上面程序我打错了。
    改正后和楼主一样。只输入一个 1 就退出了。
    AlisaDestiny
        11
    AlisaDestiny  
       Sep 23, 2018
    我查了下。可能是因为 window 下的回车是\r\n 的问题。所以他们 linux 下测试的是正常的。
    https://segmentfault.com/q/1010000000369967#a-1020000000370103
    yulon
        12
    yulon  
       Sep 23, 2018
    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  
       Sep 23, 2018 via Android
    Dvel
        14
    Dvel  
       Feb 7, 2023
    我日,这么多年了还没修复吗???
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   921 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 18:32 · PVG 02:32 · LAX 11:32 · JFK 14:32
    ♥ Do have faith in what you're doing.