2011-02-09 9 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

FYI、ほとんどの数学者は除算の前に分母を0にチェックする必要があります。私はそれが違法だと聞いた。私はプログラミング用語が "未定義の動作"だと信じています。プログラムはシグナルまたは例外を生成します。世界は崩壊するかもしれない。知るか? –

答えて

19

int argv[]はどこで取得しましたか? mainの2番目の引数はchar* argv[]です。

atoiまたはstrtodを使用して、これらのコマンドライン引数を文字列から整数に変換できます。例えば

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

しかし、オペレーティング・システムは、あなたがそれを好きかどうかの形の文字列で、あなたのコマンドライン引数を与えるために起こっているので、あなただけの、パラメータの種類を変更することはできません。

注:atoi機能を使用するには、#include <stdlib.h>(または#include <cstdlib>およびusing std::atoi;)を入力する必要があります。


あなたはエラーチェックをしたい場合は、代わりにatoistrtolを使用しています。それを使用することは、ほとんど簡単ですし、解析が終了した文字列内の場所へのポインタも提供します。終了NULを指している場合は、解析に成功しました。もちろん、argcを確認して十分なパラメータを提供し、欠落しているパラメータをargvから読み取らないようにしてください。

+0

文字列から整数に変換する別の方法は 'std :: istringstream'を使うことです。 –

+1

@トーマス:千のセパレータや通貨記号などを扱う必要がある場合は、そうです。それ以外の場合は、5倍のコードと20倍の遅さです。 –

+0

downvoteの理由は? –

2

メインの第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で数式を実行する場合は、文字列を変換する必要があります。 –