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

3 回复

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)
}

修改说明:

  1. temp 的类型从 rune 改为 string,以完整读取用户输入(如 "123")。
  2. 使用 strconv.Atoi 将字符串转换为整数,确保多位数输入被正确解析。
  3. 退出条件同时检查大写 "X" 和小写 "x",避免因大小写问题导致循环无法退出。
  4. 在每次添加整数后立即排序并打印切片,符合题目要求。
  5. 添加错误处理,对非整数输入给出提示。

这样修改后,程序能正确读取整数、处理任意数量的输入,并在输入 'X' 时退出循环。

回到顶部