2016-06-23 9 views
-1

私はprogram.exeをWindowsマシン上に作成しています。何らかの理由で私はコマンドライン引数を適切に渡すことができません。ターミナルで.exeプログラムのC++コマンドライン引数

int main(int argc, char *argv[]) { 

    ///////testing 
    cout << "\n\n(int)ARGV[1]: " << (int)argv[1] << "\n\n"; 

    return 0; 
} 

は、私が実行します。

program.exe 4 

は、私は私のコンソールに(int)ARGV[1]: 15333464を印刷します。

これはなぜ、どのようにコードを修正できるのか、私は数字4を印刷するべきです。ありがとう。

+0

なぜ即時downvote?これは私にとって非常に明確なカットではなく、私は正確な質問を見つけることができませんでした。 – JDS

+2

'char *'ポインタから単に 'int'にキャストすることはできません。 –

+0

「int」を正しく取得する方法を教えてもらえますか?私はC/C++で非常に錆びています。 – JDS

答えて

5

char*からintにキャストすると、ポインタ値bitpatternが整数として解釈されます。

代わりに、整数の指定として指される文字列を解釈する良い方法は、<string>ヘッダーのstd::stoiを使用することです。

したがって:引数は整数の有効な指定ではない場合の

#include <iostream> 
#include <stdlib.h> // EXIT_FAILURE 
#include <string>  // std::stoi 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    if(argc != 2) 
    { 
     return EXIT_FAILURE; 
    } 
    cout << "ARGV[1]: " << stoi(argv[1]) << "\n"; 
} 

stoiは、例外がスローされ、その上のコードにいくつかのメッセージを表示して終了するプログラムの原因となります–がクラッシュしました。これは一般的に間違った結果を出すのに適しています。しかし、それを処理したい場合は、C++の教科書でtrycatchを読んでください。


あなたは、コマンドライン引数としてファイル名、より一般的にはファイルシステムのパスをしたい場合は、char基づいて文字列のエンコーディングのためのWindowsの規則は文字の非常に限られたセットを持つWindows ANSI、あることに注意してください。私のノルウェーのコンピュータのいくつかのファイル名とパスは、あなたのWindows ANSIで表現することはできません(Windows ANSIはロケール固有です)。だからこそCとC++のmain引数のメカニズムはうまくいきません。

のWindows APIは、(作業)の代替として使用することができるwchar_t基づく関数の組を提供し、すなわち​​及びCommandLineToArgvW(個々の引数を生産するための標準解析)(生UTF-16でエンコードされたコマンドラインを取得します)。

Windowsコンパイラの中には、標準mainの代わりにwmainと呼ばれるものもあります。argvwchar_t* argv[]と宣言されています。これらのコンパイラには、Visual C++とg ++のMinGW64版が含まれています。

0

ここでargv[1]は文字ポインタ(char*)なので、タイプキャストによって文字ポインタを整数に変換することはできません。したがって、文字ポインタを整数に変換するには、atoi()関数を使用します。これは、C標準ライブラリ(cstdlibライブラリを含む)で使用できます。それに渡された引数が整数に変換できない場合atoi()戻るゼロこと

#include <iostream> 
#include <cstdlib> 
using std::cout; 
using std::endl; 
using std::atoi; 
int main(int argc, char *argv[]) 
{ 
    cout << atoi(argv[1]) << " " << endl; 
    return 0; 
} 

注。したがって、返された値をチェックし、ゼロの場合は関連するメッセージを出力することができます。したがって

#include <iostream> 
#include <cstdlib> 
#include <cstring> 
using std::atoi; 
using std::cout; 
using std::endl; 
using std::strcmp; 

int main(int argc, char *argv[]) 
{ 
    if(argc == 2) 
    { 
     if(atoi(argv[1]) == 0 && strcmp(argv[1], "0") != 0) 
      cout << "The argument supplied is not an integer" << endl; 
     else 
      cout << atoi(argv[1]) << " " << endl; 
    } 
    else if(argc > 2) 
     cout << "Too many arguements" << endl; 
    else 
     cout << "Insufficient arguements" << endl; 
    return 0; 
} 
+1

パラメータが "00"または "-0"の場合はどうなりますか? – Slava

+0

** - 1 **ほとんどのシステムでは '1 'を返しますが、標準では定義されておらず、初心者の読者に不愉快な習慣を教えています。また、 ' 'ヘッダを使用する場合、' atoi'は 'std :: atoi'(または' using'を持つ)として修飾されて移植可能である必要があります。さらに、誤っていないので、downvoteの理由ではなく、 'argc> = 2'の基準は、プログラムが黙って追加の引数を無視することを意味します。 –

+0

** 0 **回答が修正された後、下線を削除しました。 –

関連する問題