0

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

0 回答 0