2014-12-27 3 views
3

2의 출력 위치는 어디입니까?이동 중에 fmt 패키지 이해

STDIN에서 읽고 값을 STDOUT으로 반환하는 프로그램을 작성했습니다.

2 
7 
12 

대신에 :

7 
12 

go run program.go < input으로 프로그램을 실행 내가 얻을 때

package main 

import "fmt" 

func main() { 
    var steps, i, a, b int 
    fmt.Scanf("%d", &steps) 
    for i = 0; i <= steps; i++ { 
     fmt.Scanf("%d", &a) 
     fmt.Scanf("%d", &b) 
     fmt.Println(a + b) 
    } 
} 

은 내가 입력 파일

2 
2 5 
4   8 

있나요?

+0

'<='버그는 예상되는 출력을 얻는다. – Arjan

+0

코드를 붙여 넣을 수 있습니까? 수정 후''' astropanic

+0

글쎄, 그건 단지 코드와 입력 파일의 사본 일뿐입니다. – Arjan

답변

3

시도한 후, 입력 파일이 "Windows 형식"이고 CRLF 행이 끝나면 (Linux 컴퓨터에서) 결과가 나타납니다. . 입력 파일은 유닉스 형식 "에있는 경우 예상대로 다음과 같은 예를 들어, 라인의 끝에서 쓰레기를 추가하는 경우, LF 라인 끝으로, 그것은 또한 같은 동작을 얻을 작품 : 그래서

2x 
2 5x 
4   8x 

CR을 공백 문자로 인식하지 못하는 것 같습니다.이 문자는 "% d"형식 지정자로 건너 뛸 수 있으며 위의 예에서 x가 사용하는 것처럼 읽는 것을 멈 춥니 다.

Linux에서 작업 할 때 Windows 스타일의 줄이 끝나는 텍스트 파일을 만나는 경우는 흔한 일이 아니기 때문에 분명히 불편합니다.

+0

네 말이 맞아. 입력이 틀렸어. – astropanic

+0

문제가 생겼을 수 있습니까? 나는 이것이 문서화되거나 고의적이라고 생각하지 않는다. https://github.com/golang/go/issues – LinearZoetrope

+0

실제로, "모든 스캐닝 기능에서, 개행 문자가 따라 오는 캐리지 리턴은 일반 개행 문자로 취급된다. (\ r \ n은 \ n과 같은 의미입니다). " fmt 문서에서 강력히 의미하는 바는 – LinearZoetrope

0

i <= stepsi < steps이어야합니다.

+0

고마워,하지만 문제는 여전히'''2''를 앞세워서 발생한다. – astropanic