有中文的字符串,一定得先转成rune型,再之后求字符串长度时,也应该是用rune的len(converted_str),如果用len(str),这个长度是指ASCII的8位截下来的长度。本代码放在一个文件中,可以直接编译通过。
// Copyright 2020 David Chang. All rights reserved. // 该练习完成这么几件事: /* 打印九九乘法表 查找1到1000之间的完数 输入一串字符,统计其中的字母、空格、数字和其它等字符数量 检查是否是回文 */ package main import ( "bufio" "fmt" "os" "strconv" "strings" ) func ptr1(a, b int) { fmt.Print(a, " x ", b, " = ", a*b) } func isComplete(a int) (bool, string) { var sum = 0 var tmpstr string for i := 1; i <= a/2; i++ { if a%i == 0 { sum += i tmpstr += strconv.Itoa(i) + " + " } } return sum == a, strings.TrimSuffix(tmpstr, " + ") } func reverse(str string) string { //反转字符串用 tmp := []rune(str) //如果下面的循环用len(str),输入中文不行 for i, j := 0, len(tmp)-1; i < j; i, j = i+1, j-1 { tmp[i], tmp[j] = tmp[j], tmp[i] } return string(tmp) } func calnum(str string) (zm int, kg int, sz int, qt int) { tmp1 := []rune(str) //考虑到中文,一定得先转为rune型 for i := 0; i < len(tmp1); i++ { switch { case tmp1[i] == 32: kg++ case tmp1[i] >= 65 && tmp1[i] <= 90 || tmp1[i] >= 97 && tmp1[i] <= 122: zm++ case tmp1[i] >= 48 && tmp1[i] <= 57: sz++ default: qt++ } } return zm, kg, sz, qt } func main() { fmt.Println("打印九九乘法表:") for i := 1; i <= 9; i++ { for j := 1; j <= i; j++ { ptr1(i, j) if j != i { fmt.Print(", ") } else { fmt.Print("\n") } } } fmt.Println("查找1到1000之间的完数,就是该数等于它所有因数的和:") for i := 1; i <= 1000; i++ { result, forPrint := isComplete(i) if result { fmt.Printf("%d = %s 是一个完数\n", i, forPrint) } } fmt.Println("从命令行随便输入一串字符,统计出这串字符器中有多少字母、空格、数字和其它等字符,并检查是否是回文:") input, _ := bufio.NewReader(os.Stdin).ReadString('\n') input = strings.TrimSuffix(input, "\n") if reverse(input) == input { fmt.Printf("你输入的是一串回文:\n\"%s\"\n", input) } else { fmt.Printf("你输入的字符串原来是:\n\"%s\"\n反过来是:\n\"%s\"\n它不是一串回文\n", input, reverse(input)) } zm, kg, sz, qt := calnum(input) fmt.Printf("你输入的字母有%d个,空格有%d个,数字有%d个,以及其它字符%d个\n", zm, kg, sz, qt) }