为了账号安全,请及时绑定邮箱和手机立即绑定

从 exec.Command 输出解析整数

从 exec.Command 输出解析整数

Go
BIG阳 2022-01-17 17:49:43
我目前正在尝试从我的 Go 程序内部运行一个命令并从响应中解析一个整数。该命令返回如下输出:6fyb_src/ex1.fyb (1) 获胜!strings.Split用and分割行并删除空格strings.TrimSpaces可以正常工作。但是,在尝试将数字解析为整数时,出现以下错误:恐慌:strconv.ParseInt:解析“0 \r1 \r2 \r3 \r4 \r5 \r6”:语法无效但是将我尝试解析的字符串打印到终端会产生以下结果:6我真的不知道从这里去哪里。这个数字对我来说显然看起来像一个整数。错误消息也没有用(至少对我来说)。有人有想法吗?编辑:我正在运行的代码    out, _ := exec.Command(pwd+"/osx_fukyobrane_amd64", "fyb_src/"+filename, "fyb_src/salty.fyb", "t").CombinedOutput()    parts := strings.Split(string(out), "\n")    fmt.Println(parts[0])    rounds, err := strconv.Atoi(strings.TrimSpace(parts[0]))    if err != nil {        panic(err.Error())    }
查看完整描述

3 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

看来您的问题是parts[0]包含字符串"0 \r1 \r2 \r3 \r4 \r5 \r6"而不是数字。

strconv.Atoi 函数只寻找一个要解析的数字 - 我假设您在这种情况下试图获得第一个“0”。如果是这样,问题是这段代码:strings.Split(string(out), "\n")只寻找“\n”而不是“\r”,这显然是从osx_fukyobrane_amd64.

一种解决方案是像这样拆分行:

regexp.MustCompile(`[\r\n]+`).Split(parts[0], -1)

这会将多行合并为一行,并将 \r、\n 和 \r\n(或其他奇怪的组合)视为有效的换行符。


查看完整回答
反对 回复 2022-01-17
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

使用strings.Fields代替Split,它会自动处理\n和\r。


这也比使用 regexp 快得多,后者在 Go 中相当慢,尽管它正在得到改进。


func splitAndTrim(line string) []string {

    out := strings.Fields(line)

    for i, s := range out {

        out[i] = strings.TrimSpace(s)

    }

    return out

}


查看完整回答
反对 回复 2022-01-17
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

看起来那条线上可能有一些额外的转义数据。尝试按空间分割并使用它。


out, _ := exec.Command(pwd+"/osx_fukyobrane_amd64", "fyb_src/"+filename, "fyb_src/salty.fyb", "t").CombinedOutput()

parts := strings.Split(string(out), "\n")


parts = strings.Split(parts, " ")


fmt.Println(parts[0])


rounds, err := strconv.Atoi(strings.TrimSpace(parts[0]))

if err != nil {

    panic(err.Error())

}


查看完整回答
反对 回复 2022-01-17
  • 3 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信