You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言字符串比较异常:统计数字出现次数始终为0的问题排查

问题分析与解决方案

为什么比较逻辑不生效?

bufio.Reader.ReadString('\n') 会把输入末尾的换行符(\n)一并读取到字符串中。比如你输入数字串121并回车,变量c的值是"121\n";输入要统计的数字1并回车,变量d的值是"1\n"。循环里遍历c得到的单个字符转成字符串是"1",和带换行符的d("1\n")永远不相等,所以计数j始终为0。

不转整数的实现方法

只需要去掉读取字符串末尾的换行符,就能正常比较。推荐用strings.TrimSpace()去除首尾空白字符(包括换行符、空格等),适配不同系统的换行格式。

修改后的代码

package main
import "fmt"
import "bufio"
import "os"
import "strings"

func main (){
    reader := bufio.NewReader(os.Stdin)
    c, _ := reader.ReadString('\n')
    // 去除首尾空白,包括换行符
    c = strings.TrimSpace(c)
    
    d, _ := reader.ReadString('\n')
    d = strings.TrimSpace(d)

    j := 0
    for _, i := range c {
        if string(i) == d {
            j++
        }
    }
    fmt.Println(j)
}

更高效的优化写法

如果要统计的是单个数字(即输入的d是单个字符),可以直接把d转成rune类型,避免循环中重复转字符串:

package main
import "fmt"
import "bufio"
import "os"
import "strings"

func main (){
    reader := bufio.NewReader(os.Stdin)
    c, _ := reader.ReadString('\n')
    c = strings.TrimSpace(c)
    
    dStr, _ := reader.ReadString('\n')
    dStr = strings.TrimSpace(dStr)
    // 取输入的第一个字符作为目标(确保输入的是单个数字)
    var target rune
    if len(dStr) > 0 {
        target = rune(dStr[0])
    }

    j := 0
    for _, i := range c {
        if i == target {
            j++
        }
    }
    fmt.Println(j)
}

内容的提问来源于stack exchange,提问作者UTKARSH TYAGI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:16:06