如何在Golang中使用Scanf系列函数读取最多x个字符的字符串?
在Golang中限制输入字符串长度为最多x个字符的实现方法
用fmt.Scanf直接限制非空白字符长度
可以直接通过fmt.Scanf的格式符指定最多读取的字符数,格式为%Ns(N为你要限制的最大长度,比如5),它会读取最多N个非空白字符,遇到空格、换行等空白符时停止扫描。
示例代码:
package main import "fmt" func main() { var s string // 读取最多5个非空白字符 _, err := fmt.Scanf("%5s", &s) if err != nil { fmt.Println("读取错误:", err) return } fmt.Printf("读取到的字符串(最多5个非空白字符):%s\n", s) }
注意事项:
- 该方式仅对连续的非空白字符生效,若输入包含空格,扫描会在空格处终止。比如输入
hello world,只会读取hello;输入he llo,只会读取he。 - 如果输入的非空白字符超过N个,多余的字符会留在输入缓冲区中,后续的输入读取操作会读到这些剩余内容。
读取包含空格的最多x个字符
如果需要支持包含空格的输入并限制长度,fmt.Scanf无法直接满足,推荐使用bufio包实现:
方法1:读取整行后截取
先读取用户输入的整行内容,再截取前N个字符:
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) input, err := reader.ReadString('\n') if err != nil { fmt.Println("读取错误:", err) return } // 去除末尾的换行符 input = input[:len(input)-1] // 限制最多5个字符 if len(input) > 5 { input = input[:5] } fmt.Printf("读取到的字符串(最多5个字符,含空格):%s\n", input) }
方法2:正确处理中文的字符数限制
如果需要按实际字符数(而非字节数)限制,支持中文等多字节字符,可以将输入转为rune切片后截取:
package main import ( "bufio" "fmt" "os" ) func main() { reader := bufio.NewReader(os.Stdin) input, err := reader.ReadString('\n') if err != nil { fmt.Println("读取错误:", err) return } input = input[:len(input)-1] runes := []rune(input) if len(runes) > 5 { runes = runes[:5] } s := string(runes) fmt.Printf("读取到的字符串(最多5个字符,支持中文):%s\n", s) }
内容的提问来源于stack exchange,提问作者hani
相关产品推荐
相关产品推荐

