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