>백엔드 개발 >C++ >C에서 명령줄 인수를 효율적으로 구문 분석하려면 어떻게 해야 합니까?

C에서 명령줄 인수를 효율적으로 구문 분석하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-06 14:28:14530검색

How Can I Efficiently Parse Command-Line Arguments in C  ?

C에서 명령줄 인수 구문 분석

프로그램을 실행할 때 명령줄 인수를 지정해야 하는 경우가 많습니다. 이러한 인수는 프로그램의 동작에 영향을 미칠 수 있는 추가 정보를 제공합니다. C에는 명령줄 인수를 구문 분석하는 여러 가지 방법이 있습니다.

Boost::Program_Options 및 GNU Getopt

Boost::program_options 및 GNU getopt는 강력한 명령줄을 제공하는 널리 사용되는 두 가지 라이브러리입니다. 인수 구문 분석 기능. 이러한 라이브러리를 사용하면 필수 및 선택적 인수를 포함하여 명령줄 옵션을 정의하고 유효성을 검사할 수 있습니다. 중첩된 옵션, 짧고 긴 옵션 이름, 도움말 메뉴와 같은 고급 기능을 제공합니다.

std::Find 사용

더 간단한 명령줄 인수 구문 분석 시나리오를 위해 std::find 알고리즘을 채용할 수 있습니다. 이 접근 방식에는 명령줄 인수 벡터에서 특정 옵션 문자열을 검색하는 작업이 포함됩니다.

다음 예에서는 std::find를 사용하여 파일 이름 뒤에 오는 -f 옵션을 구문 분석하는 방법을 보여줍니다.

#include <algorithm>

char* getCmdOption(char ** begin, char ** end, const std::string & option)
{
    char ** itr = std::find(begin, end, option);
    if (itr != end &amp;&amp; ++itr != end)
    {
        return *itr;
    }
    return 0;
}

int main(int argc, char * argv[])
{
    char * filename = getCmdOption(argv, argv + argc, "-f");

    if (filename)
    {
        // Process filename
    }

    return 0;
}

명령줄 인수 구문 분석을 위한 사용자 정의 클래스

명령줄 인수 구문 분석 기능을 캡슐화하려면 사용자 정의 클래스를 생성할 수 있습니다. 옵션 존재 여부를 확인하고 옵션 값을 검색하는 방법을 제공합니다. 이 접근 방식은 코드 가독성과 구성을 향상시킵니다.

다음 예에서는 이러한 클래스를 보여줍니다.

class InputParser{
    public:
        InputParser (int &amp;argc, char **argv){
            for (int i=1; i < argc; ++i)
                this->tokens.push_back(std::string(argv[i]));
        }

        const std::string&amp; getCmdOption(const std::string &option) const{
            std::vector<std::string>::const_iterator itr;
            itr =  std::find(this->tokens.begin(), this->tokens.end(), option);
            if (itr != this->tokens.end() &amp;&amp; ++itr != this->tokens.end()){
                return *itr;
            }
            static const std::string empty_string("");
            return empty_string;
        }

        bool cmdOptionExists(const std::string &option) const{
            return std::find(this->tokens.begin(), this->tokens.end(), option)
                   != this->tokens.end();
        }
    private:
        std::vector <std::string> tokens;
};

int main(int argc, char **argv){
    InputParser input(argc, argv);
    if(input.cmdOptionExists("-h")){
        // Process -h option
    }
    const std::string &amp;filename = input.getCmdOption("-f");
    if (!filename.empty()){
        // Process filename
    }
    return 0;
}

결국 C에서 명령줄 인수를 구문 분석하는 가장 좋은 방법은 복잡성과 요구 사항에 따라 다릅니다. 귀하의 신청서. 고급 기능과 구성 가능성이 필요한 경우 Boost::program_options 또는 GNU getopt가 적합한 옵션입니다. 더 간단한 시나리오의 경우 std::find 알고리즘이나 사용자 정의 클래스가 편리한 솔루션을 제공할 수 있습니다.

위 내용은 C에서 명령줄 인수를 효율적으로 구문 분석하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.