Golang中如何输入超过100000个字符的字符串
Golang中如何输入超过100000个字符的字符串
func main() {
sc := bufio.NewScanner(os.Stdin)
buf := make([]byte, 0, 1024*1024)
sc.Buffer(buf, 1024*1024)
sc.Split(bufio.ScanWords)
sc.Scan()
temp := sc.Text()
fmt.Println(len(temp))
}
我输入了一个长度为100000的字符串,但这段代码返回了9998。 请帮忙解决。
2 回复
这可能是你的操作系统在进行刷新,尝试重复读取,直到获取到你想要的所有内容。
更多关于Golang中如何输入超过100000个字符的字符串的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码存在两个主要问题:
- 缓冲区大小设置错误:
sc.Buffer(buf, 1024*1024)的第一个参数应该是nil,而不是预分配的切片 - ScanWords分词器限制:
bufio.ScanWords会按空格分割,导致长字符串被截断
以下是修正后的代码:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
sc := bufio.NewScanner(os.Stdin)
// 正确设置缓冲区大小(最大1MB)
sc.Buffer(nil, 1024*1024)
// 使用ScanLines或ScanRunes来读取完整字符串
sc.Split(bufio.ScanLines)
if sc.Scan() {
temp := sc.Text()
fmt.Println(len(temp))
}
if err := sc.Err(); err != nil {
fmt.Fprintf(os.Stderr, "读取错误: %v\n", err)
}
}
或者使用 bufio.Reader 的替代方案:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// 读取直到换行符,适合超长字符串
input, err := reader.ReadString('\n')
if err != nil {
fmt.Fprintf(os.Stderr, "读取错误: %v\n", err)
return
}
// 去除末尾的换行符
if len(input) > 0 && input[len(input)-1] == '\n' {
input = input[:len(input)-1]
}
fmt.Println(len(input))
}
如果输入字符串包含空格且需要完整读取,使用 ScanLines;如果字符串可能超过单行,使用 bufio.Reader.ReadString 并指定合适的分隔符。

