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
相关产品推荐
相关产品推荐

