2012-03-12 3 views
0

저는 C++을 처음 접했고 간단한 추가 프로그램을 작성하는 과정에 있습니다. 당신이 볼 수 있듯이, 내가 변수에 인수 값을 할당하고이를 추가 해요심각한 오류 처리가있는 간단한 추가 코드

int main(int argc, char *argv[]) 
{ 
    if (argc==1) 
     cout << "[email protected]"; 

    if (argc==2) 
     cout << "P"; 

     //addition function 
     if (argc==3){ 

     float number1 = atof (argv[1]); 
     float number2 = atof (argv[2]); 

     cout << number1 + number2 << endl; 
     } 

    if (argc>3) 
     cout << "P"; 

    return 0; 

} 

: 지금까지 난 단지 매개 변수의 숫자와 함께 작동이 코드를 가지고있다. 이러한 argvs는 테스트 대상이며 모든 것을 처리 할 수 ​​있어야합니다. 그래서 몇 가지 문제가 있습니다 :

변수 중 하나가 유효한 숫자 (예 : 1, 3000)가 아닐 때, 어떻게 프로그램을 실행시켜야합니까? 유효한 숫자는 방정식 (분수 또는 기타와 같은) 자체가 아니어야합니다.

- 이상한 유효 숫자 (3,000.2 (쉼표에주의))가 입력되면 at 3으로 변경됩니다. 어떻게 변경합니까?

그래, 내게 통합 된 오류 검사/처리 기술을 던져라. 나는 너를 영원히 사랑할 것이다.

+0

왜 1 개 3000 유효하지 않은 번호는? –

+0

문자열을 정수 또는 부동으로 구문 분석하는 대부분의 루틴은 읽지 않은 첫 번째 숫자가 아닌 숫자에서 중지합니다. 이것이 '3,000.2'가 '3'으로 변환 된 이유입니다. 또한 명령과 점은 다른 로케일에서 다른 의미를가집니다. 어떤 '3,000'은 3 천이고 다른 것들은 3 점 0입니다. –

답변

0

atof은 문자열이 유효한 숫자를 나타내는 지 여부를 감지하기에 충분하지 않습니다 (예 : "0.25lalala"의 경우 0.25를 반환).

전체 C++ 솔루션 : 첫째 : 당신의 main 함수 Then

#include <sstream> 
#include <iostream> 
using namespace std; 

: 하나의 추가 헤더를 포함

//addition function 
    if(argc==3) 
    { 
      float number1 = 0.0; 
      float number2 = 0.0; 
      istringstream istr(argv[1]); 
      istr >> number1; 
      if(istr.rdstate() != ios::eofbit) 
      {/* argv[1] is not a valid float number */ 
      /* it works even if undeflow or overflow occures */ 
      } 
      istr.clear(); 
      istr.str(argv[2]); 
      istr >> number2; 
      if(istr.rdstate() != ios::eofbit) 
      {/* argv[2] is not a valid float number */ 
      /* it works even if undeflow or overflow occures */ 
      } 

      cout << number1 + number2 << endl; 
    } 
+0

그게 확실한 개선이지만, 나는 또한 4로 출력되는 4,000 (쉼표에주의)과 같은 숫자를 사용할 수 있어야한다고 생각합니다. 아마도이 코드에서 사용 된 모든 것을 아직 이해하지 못했을 것입니다. – user1263239