2011-11-04 6 views
0
//sLine is the string 
for(int l = 0; l < sLine.length(); l++) 
{ 
    string sNumber; 
    if(sLine[l] == '-') 
    { 
     sNumber.push_back(sLine[l]); 
     sNumber.push_back(sLine[l + 1]); 
     l++; 
    } 
    else if(sLine[l] != '\t') 
    { 
     sNumber.push_back(sLine[l]); 
    } 
    const char* testing = sNumber.c_str(); 
    int num = atoi(testing); 
    cout << num; 
} 

이 for 루프는 문자열의 각 문자를 검사하고이 문자열의 모든 숫자를 int로 변환합니다. 하지만 어떤 이유에서, atoi 함수는 두번 그것을하고 있기 때문에 내가 그것을 말할 때, 그것은 어떤 이유로 두 번 표시됩니다 ... 왜죠?C++ 문자열을 int로 변환

예 : INPUT 3/3 -3 9-5
-2 -2 9
7 1 8 4 4 -7 -11 -13 -13
-1 -2 -3

OUTPUT 3030-309050 -80-20907010
-70804040-80
-90-90-10-40-80

+3

'sNumber.push_back (sLine [l + 1]);'은 문자열 끝을 넘어 액세스 할 수 있습니다. – Vlad

+0

@ Vlad하지만 음수로 인해 거기에 넣었습니다 ... – Danny

+0

전체 루프를 두 번 실행하고 있습니다. –

답변

10

atoi 반환 0하는 숫자가 아닌 문자열이 주어 졌을 때 때문에이 모든 nonrecognized 문자 0을 표시하는 것 당신이 원하는 무엇을 그러나

입니다 :

std::stringstream ss(sLine); 
int num; 
while(ss >> num) { 
    cout << num; 
} 
0

이동이 :

const char* testing = sNumber.c_str(); 
int num = atoi(testing); 
cout << num; 

코드 마지막 부분 인 } 아래에 for 루프를 붙여 넣습니다. 현재 루프의 모든 반복에서 실행되므로 sLine에있는 모든 문자에 대해 별도의 출력물을 얻습니다. (sLine의 마지막 문자는 라인 피드 그래서 이것은 당신이 단 하나 개의 숫자를 썼다 생각하는 경우에도 발생할 수 있습니다 될 수 있습니다.)

편집 : 또한 대한 루프 위 sNumber의 선언을 이동합니다.

if (sLine[l] == '-')if (sLine[l] == '-' && (l + 1) < sLine.length())으로 변경하여 대시가 줄의 마지막 문자 인 경우 문자열 끝 부분을 벗어나지 않도록 할 수 있습니다.

변수 l의 이름을 1처럼 보이지 않게 변경할 수도 있습니다. =)

이것이 올바른 방법 일지 다시 생각해보고 싶을 수도 있습니다. (보통 간단한 일로 복잡해지면 실수 일 수 있습니다.) (! 공간 등)

는, 놀랍게도 간단한
+0

sNumber가 범위를 벗어났습니다 –

+0

감사합니다. – Arkku

0

숫자가 아닌 문자의 경우 0을 추가로 출력합니다. 문제는 atoi이 입력을 변환 할 수 없을 때 0을 반환하므로 공백이 0으로 인쇄된다는 것입니다.

0

바퀴를 다시 만드는 것은 고통스러운 방법처럼 보입니다. 이 문자열을 사용하여 구문 분석하는 것이 좋습니다.

std::stringstream strm(sLine); 
int num; 
while(strm >> num) 
{ 
    std::cout << num << std::endl; 
} 
+3

'eof()'또는'fail()'을 루프 조건으로 사용하지 마십시오. 그렇게하면 거의 항상 버그 코드가 발생합니다. 오히려'while (strm >> num) {...}'을하십시오. 'eof()'의 악의적 인 힘의 시위를 위해 : http://ideone.com/ZKa67 –

+0

@Rob 데모에 감사드립니다. 답변을 수정할 것입니다. – Jon