我是一名 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;
}