处理命令行参数,允许任何订单

时间:2014-02-06 02:42:45

标签: c++ command-line user-input

好的我正在创建一个允许用户以任何顺序输入的程序。术语-1或-2用于表示操作模式。而参数-c总是在文件名之前。这是我编写的循环,允许以用户希望的任何顺序输入这些循环。

int main(int argc, char *argv[])
{
    string qcolors_name;
    string inputFileName;
    pmode_t mode = run_process2;
    // perform command line argument checking
    if(argc < 2){
        cerr << "Not enough arguments" << endl;
        return 0;
    }

    for(int i = 1; i < argc - 1; i++){
        if(argv[i] == "-1"){
            mode = run_process1;
            cout << "Mode 1" << endl;
        }else if(argv[i] == "-2"){
            mode = run_process2;
        }else if(argv[i] == "-c"){
            qcolors_name = argv[i+1];
            cout << qcolors_name << endl;
            i++;
        }else if(argc-1 == i){
            break;
        }else{
            cout << argv[i] <<endl;
            cerr << "arguments error"<<endl;;
            return 0;
        }

    }

然而程序似乎总是转储到参数错误消息,即使它输出argv [i]是= -1。这是我测试过的东西之一,但绝不应该达到这种情况。我确定它的语法明智,我做错了。

修改

这是一个带有样本错误输出的输入。

USER> ./colorfun -1 -c qc_bw.txt mountains.ppm      <-  9:46PM
-1
arguments error

2 个答案:

答案 0 :(得分:2)

它是C,你不能只用str1 ==&#34; smth&#34;来比较字符串。请改用strcmp()

更详细的解释:C中的operator ==比较整数实体:数字,指针等。"smth"本质上是指向程序常量段内存区域的指针。这就是代码

的原因
const char* a = "abc";
const char* b = "abc";
assert(a == b);

可以给予真实,无论是&amp; b可以指向单个存储器位置。但是这个表达式从不比较字母&#34; a&#34;,&#34; b&#34;,&#34; c&#34;从ab,它只比较指针。同样在Java中,您必须使用str1.equals(str2),因为Java运算符==还会比较整数实体(数字,字符和&#34;指向对象的指针&#34;)。相反,在C ++,Python和其他带有运算符重载的编程语言中,两个字符串的==通常会导致逐字符比较。

答案 1 :(得分:0)

在C ++中,你必须首先将参数转换为std :: string,然后你可以使用==运算符对它们进行比较,如下所示:

int main(int argc, char* argv[]) {
    for (int i = 1; i < argc; i++) {
        if (std::string(argv[i]) == "-a") {
            std::cout << "You passed parameter -a" << std::endl;
        } else if (std::string(argv[i]) == "-b") {
            std::cout << "You passed parameter -b" << std::endl;
        }
    }
    return 0;
}