2012-02-13 7 views
0

이전에 Visual Studio를 사용한 후 RedHat에서 g ++ 컴파일로 이전 할 때 흥미로운 오류가 발생했습니다.쉼표를 추가 할 때 문자열 *에서 예기치 않은 결과가 나타납니다

는 I는 다음과 같다 루프를 가지고

for(unsigned int i = 0; i < data.size(); i ++){ 

    for(int j = 0; j < data[i]->size; j++){ 

     cout << data[i]->columns[j]<< ','; 
    } 

    cout << endl; 

} 

여기서 데이터 [I] -> 칼럼 스트링 *, 그리고 의도는 콤마로 분리 출력한다. 는 이전에,이 일을하지만, 오늘 내 출력은 다음과 같은 :

,ata, two, three, four 
,ata2, two, three, four 
,ata3, two, three, four 

반면에 나는 약간의 코드를 변경하는 경우 : < cout을 < 타이 [I] -> 열 [J] < < ENDL;

내가 얻을 :

data 
two 
three 
four 

data2 
two 
three 
four 

은 쉼표로 이러한 문자를 겹쳐 어떤 원인이 될 수 있을까? 이것은 Visual Studio 컴파일러에서 발생하지 않았습니다.

+0

오류를 나타내는 실제 코드 * 붙여 넣기 (* not * retype) * 실제 코드를 붙여 넣으십시오. 게시 한 코드 스 니펫이 컴파일 될 가능성이 없습니다. http://sscce.org/. –

답변

4

각 행의 마지막 항목이 \ r 및/또는 \ n 인 것처럼 보입니다.

그래서 사에 당신은 당신의 ENDL 출력이 당신이 얻고 있기 때문에이 라인은 사 후 휴식 확인하는 것 "fourBREAK,"

얻을.

+4

더 구체적으로 캐리지 리턴 문자 ('\ r') – rve

+0

이게 옳은 것 같습니다. 마지막 문자를 null로 설정하면 문제가 해결됩니다. rve- 캐리지 리턴은 정확히 무엇이며, 캐리지 리턴을 발생시키는 원인은 무엇입니까? 나는 '\ n'을 문자열의 구분자로 사용하여 데이터를 파싱하고 문자열 자체에 '\ n'을 포함시키지 않을 것이라고 생각했습니다. – Glem

+0

@Glem Windows는 \ r \ n을 사용하여 Unix가 \ n만을 사용하는 새 줄을 나타냅니다. \ r은 캐리지 리턴 (줄의 시작 부분까지)이고 \ n은 새로운 줄입니다. 그것을 타자기처럼 생각하십시오. 먼저 막대를 처음으로 다시 이동해야합니다. 그런 다음 새 줄을 추가해야합니다. – Timeout

2

입력 파일 (사용자가 data 일 때 읽음)은 MS-DOS 텍스트 형식입니다. dos2unix 또는 유사한 유틸리티를 사용하거나 입력시 \r을 무시하십시오.

관련 문제