Golang如何验证用户输入只能为整数?

huangapple go评论79阅读模式
英文:

Golang how to validate user input for only int

问题

在Go语言中,可以使用fmt.Scanf函数来扫描整数。以下是一个示例代码,用于扫描用户输入的年龄:

package main

import (
	"fmt"
)

func AgeInput() {
	var age int
	fmt.Println("请输入您的年龄:")
	_, err := fmt.Scanf("%d", &age)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println("您输入的年龄是:", age)
}

func main() {
	AgeInput()
}

在上面的代码中,fmt.Scanf函数用于扫描用户输入的整数,并将其存储在age变量中。如果输入的不是整数,将会打印出错误信息。

另外,你也可以使用strconv.Atoi函数将用户输入的字符串转换为整数,并进行验证。以下是一个示例代码:

package main

import (
	"fmt"
	"strconv"
)

func AgeInput() {
	var ageStr string
	fmt.Println("请输入您的年龄:")
	_, err := fmt.Scanln(&ageStr)
	if err != nil {
		fmt.Println(err)
		return
	}
	age, err := strconv.Atoi(ageStr)
	if err != nil {
		fmt.Println("输入的不是有效的年龄")
		return
	}
	fmt.Println("您输入的年龄是:", age)
}

func main() {
	AgeInput()
}

在上面的代码中,fmt.Scanln函数用于扫描用户输入的字符串,并将其存储在ageStr变量中。然后使用strconv.Atoi函数将ageStr转换为整数类型的age变量。如果转换失败,则说明输入的不是有效的年龄。

希望这些代码对你有帮助!如果有任何问题,请随时提问。

英文:

is there a way to scan only integers in Go? like an age or a number of order etc. so you don't want user to enter letters or signs.
Scanf apparently don't work, it get skipped and print instead "unexpected newline"

func AgeInput(age int) {
fmt.Println("enter your Age :..")


     _, err := fmt.Scanf("%d", &UserAge)

     if err != nil {
        fmt.Println(err)
     }

}

I also tried to use contains and containsAny to check if the input has any numbers and if not then it is not valid and the user will be asked to try again but it returns either always true or always false

func ValidateAge(age int){
AgeInput(age)
if strings.Contains(strconv.Itoa(UserAge), "1234567890"){
	validAge = true
}
for !validAge {
	fmt.Println("wrong input try again")
	AgeInput(age)
}

}

答案1

得分: 1

我认为你在这里的思路是正确的,但只需要稍微调整一下你的代码:

package main

import (
    "fmt"
)

func main() {
    fmt.Println("请输入您的年龄:")

    var userAge int
    for true {
        _, err := fmt.Scanf("%d", &userAge)
        if err == nil {
            break
        }
        fmt.Println("无效的年龄 - 请重试")
        var dump string
        fmt.Scanln(&dump)
    }

    fmt.Println(userAge)
}

Scanf只会扫描到匹配的部分,但会保留剩余的行,所以我们需要使用fmt.Scanln来清除标准输入缓冲区。

英文:

I think you were on the right track here, but just need to tweak you code a little:

package main

import (
        "fmt"
)

func main() {
    fmt.Println("Enter your Age: ")

    var userAge int
    for true {
        _, err := fmt.Scanf("%d", &userAge)
        if err == nil {
            break
        }
        fmt.Println("Not a valid age - try again")
        var dump string
        fmt.Scanln(&dump)
    }

    fmt.Println(userAge)
}

Scanf only scans until it gets a match, but will leave the rest of the line untouched, so we need to clear the STDIN buffer with a fmt.Scanln

huangapple
  • 本文由 发表于 2022年5月29日 08:50:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/72420222.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定