Golang中if语句比较两个rune时遇到的问题
Golang中if语句比较两个rune时遇到的问题
package main
/*编写一个程序,提示用户输入整数并将整数存储在已排序的切片中。
该程序应写成一个循环。在进入循环之前,
程序应创建一个大小为3的空整数切片。
在每次循环过程中,程序提示用户输入一个要添加到切片中的整数。
程序将整数添加到切片中,对切片进行排序,并按排序顺序打印切片的内容。
切片必须能够增长大小以容纳用户决定输入的任何数量的整数。
只有当用户输入字符'X'而不是整数时,程序才应退出(退出循环)。*/
import ("fmt"
"sort"
)
func main() {
slice := make([]int, 0,3)
var temp rune
for true {
fmt.Println("enter the integers\n")
fmt.Scan(&temp)
if(temp=='x'){
break
}
slice=append(slice,int(temp))
fmt.Println(slice)
}
sort.Ints(slice)
fmt.Println(slice)
}
更多关于Golang中if语句比较两个rune时遇到的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Anantheshwar_Pai:
程序应创建一个大小为(长度)3的空整数切片。
一个空切片不可能长度为3,因为如果长度为3,则意味着它包含了3个元素。
请向你的老师要求练习中使用恰当且明确的措辞。
话虽如此,每当有返回 error 的情况时,请务必检查它。在非nil的情况下读取错误信息,可能对找到解决方案有很大帮助。
更多关于Golang中if语句比较两个rune时遇到的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我发现的第一个问题是代码忽略了 scan 返回的错误,该错误提示“期望一个整数”,因此我改用 scanf 来扫描字符。但它也将回车键视为另一个字符,所以我向模式中添加了“\n”。
然后,为了从 rune 中获取数字,你需要减去 ‘0’ 这个 rune 来得到它们之间的差值。
以下是修复问题后的代码:
package main
import (
"fmt"
"sort"
)
func main() {
slice := make([]int, 0, 3)
var temp rune
for true {
fmt.Println("enter the integers\n")
_, err := fmt.Scanf("%c\n", &temp)
if err!=nil {
fmt.Println(err)
}
if temp == 'x' {
break
}
slice = append(slice, int(temp - '0'))
fmt.Println(slice)
}
sort.Ints(slice)
fmt.Println(slice)
}
你的代码中存在一个关键问题:fmt.Scan(&temp) 将输入读取为 rune 类型,但用户输入的是整数(如 123),这会导致 rune 只捕获第一个字符的 Unicode 码点。例如,输入 123 会被解析为 rune('1'),其整数值为 49,而不是预期的 123。此外,当用户输入 'X' 时,rune('X') 的值为 88,但代码中比较的是小写 'x'(值为 120),这可能导致循环无法正确退出。
以下是修改后的代码,使用 string 读取输入,并处理整数转换和退出条件:
package main
import (
"fmt"
"sort"
"strconv"
)
func main() {
slice := make([]int, 0, 3)
var input string
for {
fmt.Print("Enter an integer (or 'X' to exit): ")
_, err := fmt.Scan(&input)
if err != nil {
fmt.Println("Error reading input:", err)
continue
}
if input == "X" || input == "x" {
break
}
num, err := strconv.Atoi(input)
if err != nil {
fmt.Println("Invalid input. Please enter an integer.")
continue
}
slice = append(slice, num)
sort.Ints(slice)
fmt.Println("Sorted slice:", slice)
}
fmt.Println("Final sorted slice:", slice)
}
修改说明:
- 将
temp的类型从rune改为string,以完整读取用户输入(如"123")。 - 使用
strconv.Atoi将字符串转换为整数,确保多位数输入被正确解析。 - 退出条件同时检查大写
"X"和小写"x",避免因大小写问题导致循环无法退出。 - 在每次添加整数后立即排序并打印切片,符合题目要求。
- 添加错误处理,对非整数输入给出提示。
这样修改后,程序能正确读取整数、处理任意数量的输入,并在输入 'X' 时退出循环。

