golang之ACM输入输出

555 阅读1分钟

我正在参加「掘金·启航计划」。

不知行数,多行,且扫描一行处理一行

fmt.Scan()
从标准输入扫描文本,读取由空白格分割的值,保存并传递给本函数的参数中,换行符也视为空白格。
io.EOF表示输入结束

func main(){
    var a,b int
    for{ 
        if  _,err:=fmt.Scan(&a,&b);err!=io.EOF{
             fmt.Println(a+b)
        }else {
            break
        }
    }

多行,第一个作为长度,其他座位数组读入

ac.nowcoder.com/acm/contest…

bufio.NewReader(os.Stdin)

func main(){
    input:=bufio.NewScanner(os.Stdin)
    for input.Scan(){
        nums:=strings.Split(input.Text()," ")
        res:=0
        for i:=1;i<len(nums);i++{
            num,_:=strconv.Atoi(nums[i])
            res+=num
        }
        fmt.Println(res)
    }  
}

Scanner缓冲区扫描数据流时,使用带缓冲区的io,缓冲区大小有限制。此时缓冲区中数据格式为[]byte。bufio.NewScanner是通过io.EOF停止输入,也就是说,此时缓冲区存在多行数据。
使用input.Scan,即读入下一行,并移除行末的换行符。
此时使用Text()将作为包含其字节的字符窜返回,使用Split按照空格分割后转换为string数组,Atoi将字符串转换为整型。

一行字符串操作

func main(){
    input:=bufio.NewScanner(os.Stdin)
    input.Scan()
    input.Scan()
    str:=strings.Split(input.Text()," ")
    sort.StringSlice.Sort(str)
    fmt.Println(strings.Join(str," "))
    
}
  • strings.Split得到的是string数组

⚠️

bufio.NewScanner的缓存区有一定的容量限制,如果超缓冲区,需要扩容

// 扩容
bufio.NewScanner(os.Stdin)
bs := make([]byte, 2000*1024) 
input.Buffer(bs, len(bs)) // 设置缓冲区大小
// 默认大小是 MaxScanTokenSize = 64 * 1024

参考

blog.csdn.net/aron_conli/…