2011-02-09 4 views
5

나는 C++에서 실행될 때 인수를 받아 들일 수있는 일종의 계산기가있다. 그러나 인수로 7을 입력하면 변수에 넣을 때 10354가 될 수 있습니다. 여기 내 코드는 다음과 같습니다.C++ 용 정수 인수

#include "stdafx.h" 
#include <iostream> 

int main(int argc, int argv[]) 
{ 
    using namespace std; 
    int a; 
    int b; 
    if(argc==3){ 
     a=argv[1]; 
     b=argv[2]; 
    } 
    else{ 
     cout << "Please enter a number:"; 
     cin >> a; 
     cout << "Please enter another number:"; 
     cin >> b; 
    } 
    cout << "Addition:" << a+b << endl; 
    cout << "Subtaction:" << a-b << endl; 
    cout << "Multiplycation:" << a*b << endl; 
    cout << "Division:" << static_cast<long double>(a)/b << endl; 
    system("pause"); 
    return 0; 
} 
+0

항상 최대 경고를 사용하도록 코드를 컴파일하십시오. gcc를 사용할 때'-Wall'. 필자는 컴파일러가 포인터를 정수로 변환하는 것에 대한 경고와 함께이 실수를 저지른 것으로 의심합니다. –

+0

@deft_code? 어디 포인터에서 정수로 변환? 'main'은 단순히 타입 서명이 잘못되었습니다. –

+0

참고로, 대부분의 수학자는 나누기 전에 0으로 분모를 확인해야합니다. 나는 그것이 불법이라고 들었다. 나는 프로그래밍 용어가 "정의되지 않은 행동"이라고 생각한다. 프로그램이 신호 또는 예외를 생성합니다. 세상이 무너질 수도 있습니다. 누가 알아? –

답변

19

int argv[] 어디서 났습니까? main의 두 번째 인수는 char* argv[]입니다.

atoi 또는 strtod을 사용하여 이러한 명령 줄 인수를 문자열에서 정수로 변환 할 수 있습니다. 예를 들어

:

a=atoi(argv[1]); 
    b=atoi(argv[2]); 

그러나 운영 체제가 당신이 그것을 좋아 여부 형식 문자열에 당신에게 당신의 명령 줄 인수를 제공하는 것입니다 때문에 그냥, 매개 변수 유형을 변경할 수 없습니다.

참고 : atoi 기능을 사용하려면 #include <stdlib.h> (또는 #include <cstdlib>using std::atoi;)이어야합니다. 당신이 오류 검사를 원하는 경우


, strtol 대신 atoi 사용합니다. 그것을 사용하는 것은 거의 쉽고 파싱이 끝난 문자열의 위치에 대한 포인터를 제공합니다. 종료 NUL을 가리키는 경우 구문 분석이 성공한 것입니다. 물론 argc을 확인하여 사용자가 충분한 매개 변수를 제공했는지 확인하고 누락 된 매개 변수를 argv에서 읽지 않도록하는 것이 좋습니다.

+0

문자열에서 정수로 변환하는 또 다른 방법은'std :: istringstream'을 사용하는 것입니다. –

+1

@ 토마스 : 수천 개의 구분 기호와 통화 기호 및 물건을 처리해야하는 경우 그렇습니다. 그렇지 않은 경우 코드의 5 배, 느린 20 배입니다. –

+0

downvote 이유는 무엇입니까? –

2

메인의 두 번째 인수는 char* argv[] 또는 char** argv이어야합니다. 그렇다면 그들을 int로 변환해야합니다.

4

기능 서명은 int main(int argc, char *argv[])입니다. argv는 문자열 포인터의 배열입니다.

인수가 7이면 문자열 형식 ("7")이됩니다. atoi()을 사용하여 숫자 7로 변환하십시오.

+0

감사합니다. 나는 그 기능에 대해 몰랐다. static_cast 및 인수 int argc 및 char * argv []를 사용하면 오류가 발생합니다. – Rob

+0

@Rob : char *를 int로 캐스팅했다면 컴파일러가 허용하지 않기 때문에 기쁩니다. 그것을 컴파일 할 수 있다면 심각한 버그가있는 프로그램을 가질 수 있습니다. 문자열은 문자의 배열입니다. 문자 '7'의 값은 7이 아닙니다. 7로 수학을 수행하려면 문자열을 변환해야합니다. –