fmt.Scanln 예기치 않은 줄바꿈 오류: Go의 입력 처리 탐구
많은 Go 개발자가 다음과 같은 경우 "fmt.Scanln 예상 줄바꿈 오류"를 경험합니다. 사용자 입력과 상호 작용합니다. 이 오류를 이해하려면 fmt.Scan 및 fmt.Scanln의 작동 방식을 자세히 살펴보는 것이 중요합니다.
fmt.Scan 및 공백 구분 입력
fmt.Scan은 공백을 읽습니다. 표준 입력과 분리된 입력. fmt.Scan에 제공된 각 인수는 공백으로 구분된 단일 단어 또는 값에 해당합니다. 개행 문자의 존재는 공백으로 처리되어 여러 줄 입력이 가능합니다. 이는 다음 코드로 예시됩니다.
<code class="go">import "fmt" func main() { var i int _, err := fmt.Scan(&i) if err == nil { fmt.Println("read 1 integer: ", i) } }</code>
입력 "123"이 제공되면 이 코드는 "1 정수 읽기: 123"을 읽고 인쇄합니다.
fmt.Scanln 및 줄 바꿈 구분 입력
반대로 fmt.Scanln은 줄 바꿈 문자를 구분 기호로 기대합니다. 줄 바꿈까지 모든 입력을 읽은 후 구문 분석을 중지합니다. 이는 Scanln 문서에 명확하게 명시되어 있습니다.
"Scanln은 Scan과 유사하지만 개행에서 스캔을 중지하고 마지막 항목 뒤에는 개행 또는 EOF가 있어야 합니다."
이 동작 다음 코드에서 나타납니다.
<code class="go">import "fmt" func main() { var s string _, err := fmt.Scanln(&s) if err == nil { fmt.Println("read 1 line: ", s) } }</code>
"everybody love ice cream"을 입력하면 이 코드는 "1줄 읽기: 모든 사람이 아이스크림을 좋아합니다"를 읽고 인쇄합니다. fmt.Scanln은 마지막 줄 바꿈으로만 구분되므로 공백으로 구분된 "everybody" 및 "loves"가 있어도 구문 분석이 중단되지 않습니다.
오류 이해하기
In 제공된 초기 예에서 Scanln은 입력 문자열 "everybody love ice cream"이 줄 바꿈으로 끝나지 않기 때문에 "예상 줄 바꿈" 오류가 발생합니다. 이 문제를 해결하려면 입력 끝에 개행 문자가 있어야 합니다.
줄 읽기를 위한 대체 방법
목표가 입력 줄을 읽는 것이라면 ReadString을 사용하세요. bufio.Reader 패키지는 fmt.Scanln에 대한 신뢰할 수 있는 대안입니다:
<code class="go">import ( "bufio" "os" ) func main() { reader := bufio.NewReader(os.Stdin) line, err := reader.ReadString('\n') if err == nil { fmt.Println("read 1 line: ", line) } }</code>
위 내용은 fmt.Scanln 예상치 못한 개행 오류: fmt.Scan과 fmt.Scanln의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!