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


你的代码存在两个主要问题:

  1. 缓冲区大小设置错误sc.Buffer(buf, 1024*1024) 的第一个参数应该是 nil,而不是预分配的切片
  2. 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 并指定合适的分隔符。

回到顶部