>백엔드 개발 >Golang >Go의 `bufio.Reader.ReadString`이 선행 구분 기호를 유지하는 이유는 무엇이며 이 문제를 어떻게 피할 수 있습니까?

Go의 `bufio.Reader.ReadString`이 선행 구분 기호를 유지하는 이유는 무엇이며 이 문제를 어떻게 피할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-18 05:10:11329검색

Why Does Go's `bufio.Reader.ReadString` Preserve Leading Delimiters, and How Can I Avoid This Issue?

Reader.ReadString은 선행 구분 기호를 유지할 수 있습니다

Go에서는 입력을 구문 분석할 때 bufio.Reader.ReadString 동작이 다를 수 있습니다. 다음 시나리오를 고려하십시오.

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Who are you? Enter your name: ")
    text, _ := reader.ReadString('\n')
    if text == "Alice" || text == "Bob" {
        fmt.Printf("Hello, ", text)
    } else {
        fmt.Printf("You're not allowed in here!")
    }
}

여기서 ReadString은 사용자 입력을 읽는 데 사용되며 이름은 개행 문자로 끝나야 합니다. 그러나 입력한 이름이 "Alice" 또는 "Bob"과 일치하면 프로그램이 잘못 액세스를 거부합니다.

원인 및 해결 방법

이 문제는 ReadString이 선행 항목을 보존하기 때문에 발생합니다. 구분 기호(이 경우 'n')입니다. "Alice"와 같은 이름을 입력하면 텍스트에 저장된 문자열에 "Alice"와 후행 줄 바꿈이 모두 포함됩니다. 이 추가 개행 문자는 문자열 비교가 예상 값과 일치하지 못하게 합니다.

이 문제를 해결하려면 다음 접근 방식을 고려하십시오.

  1. 선행 공백 자르기: 이전 텍스트를 "Alice" 또는 "Bob"과 비교하려면 strings.TrimSpace(text)를 사용하여 개행 문자를 포함한 선행 공백을 제거하세요. 문자.
  2. 대신 ReadLine 사용: 또는 ReadString 대신 reader.ReadLine()으로 전환하세요. 이 함수는 선행 또는 후행 구분 기호를 포함하지 않고 입력을 반환합니다. reader.ReadLine()은 바이트를 반환합니다. 따라서 string(bytes)을 사용하여 문자열로 변환하세요.

위 내용은 Go의 `bufio.Reader.ReadString`이 선행 구분 기호를 유지하는 이유는 무엇이며 이 문제를 어떻게 피할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.