私は C# ソフトウェア開発者です。私は C++ ネイティブ コーディングにアプローチしようとしていますが、簡単な C++ コンソール アプリケーションから始めたいと思っています。
IDE として Visual Studio 2010 を使用しています。
Xgetopt と呼ばれる getopt 関数の Win32 ポートも使用しています。
これが私の主な機能です:
#include "stdAfx.h"
#include <iostream>
#include "XGetopt.h"
using namespace std;
int main(int argc, TCHAR *argv[])
{
for (int i = 0; i < argc; i++)
{
printf(("argv[%d]=<%s>\n"), i, argv[i]);
}
bool add=false;
bool subtract=false;
bool multiply=false;
bool divide=false;
int val1 = 0;
int val2 = 0;
if(argc != 7)
{
cout << "\n Usage : <binary-name> -o <operation> -x <val1> -y <val2>\n";
return 1;
}
int opt = 0;
while ((opt = getopt(argc, argv, _T("o:x:y:"))) != EOF)
{
switch( opt )
{
case 'o':
if(_tcscmp(_T("add"), optarg))
{
add = true;
}
else if(_tcscmp(_T("subtract"), optarg))
{
subtract = true;
}
else if(_tcscmp(_T("divide"), optarg))
{
divide = true;
}
else if(_tcscmp(_T("multiply"), optarg))
{
multiply = true;
}
else
{
//printf("\n Wrong option \n");
return 1;
}
break;
case 'x':
//printf("\n 'x' detected \n");
val1 = _ttoi(optarg);
//printf("\n val1 = [%d]\n",val1);
break;
case 'y':
//printf("\n 'y' detected \n");
val2 = _ttoi(optarg);
//printf("\n val2 = [%d]\n",val2);
break;
case '?':
//printf("\n '?' detected \n");
//printf("\n Usage : <binary-name> -o <operation> -x <val1> -y <val2>\n");
return 1;
default :
//printf("\n Wrong argument passed \n"); //shouldn't ideally get here
return 1;
}
}
}
これは Xgetopt.cpp ファイルです。
#include "stdafx.h"
#include "XGetopt.h"
TCHAR *optarg; // global argument pointer
int optind = 0; // global argv index
int getopt(int argc, TCHAR *argv[], TCHAR *optstring)
{
static TCHAR *next = NULL;
if (optind == 0)
next = NULL;
optarg = NULL;
if (next == NULL || *next == _T('\0'))
{
if (optind == 0)
optind++;
if (optind >= argc || argv[optind][0] != _T('-') || argv[optind][1] == _T('\0'))
{
optarg = NULL;
if (optind < argc)
optarg = argv[optind];
return EOF;
}
if (_tcscmp(argv[optind], _T("--")) == 0)
{
optind++;
optarg = NULL;
if (optind < argc)
optarg = argv[optind];
return EOF;
}
next = argv[optind];
next++; // skip past -
optind++;
}
TCHAR c = *next++;
TCHAR *cp = _tcschr(optstring, c);
if (cp == NULL || c == _T(':'))
return _T('?');
cp++;
if (*cp == _T(':'))
{
if (*next != _T('\0'))
{
optarg = next;
next = NULL;
}
else if (optind < argc)
{
optarg = argv[optind];
optind++;
}
else
{
return _T('?');
}
}
return c;
}
Xgetopt.h のソース コードは次のとおりです。
#ifndef XGETOPT_H
#define XGETOPT_H
extern int optind, opterr;
extern TCHAR *optarg;
int getopt(int argc, TCHAR *argv[], TCHAR *optstring);
#endif //XGETOPT_H
これは私のコマンドライン引数です:
Test.exe -o 追加 -x 4 -y 5
理由はわかりませんが、while ループに入ることができません。
私はそれをデバッグしましたが、どういうわけか私は常にこれを入力します if 条件(「Xgetopt.cpp」ファイル内):
if (optind >= argc || argv[optind][0] != _T('-') || argv[optind][1] == _T('\0'))
{
optarg = NULL;
if (optind < argc)
optarg = argv[optind];
return EOF;
}