2014-02-06 2 views
0

ОК Я создаю программу, которая позволяет вводить пользователя в любом порядке. Термин -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. Это одна из вещей, которые я тестировал, хотя и никогда не должен был доходить до этого случая. Я уверен, что это что-то синтаксическое, что я делаю неправильно.

РЕДАКТИРОВАТЬ

Вот Imput с выходом ошибки выборки.

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

Какова точная командная строка, которая не работает? –

+0

Я добавил пример ввода и ошибку вывода, которую он в настоящее время дает мне. –

+0

Я делаю, если аргумент argc-1 == i игнорирует последний вход. Извините, я добавлю, что последний вход также всегда является именем файла. Его отказ от -1. Как вы можете видеть из выходной ошибки, так как она печатает текущий аргумент прямо перед выдачей ошибки. Упс, это также объясняется тем фактом, что сам цикл не проверяет последнюю запись. –

ответ

2

Это C, вы не можете сравнивать строки только с str1 == "smth". Вместо этого используйте strcmp().

Более подробные объяснения: оператор == в C сравнивает интегральные объекты: цифры, указатели и т. Д. "smth" по существу является указателем на область памяти в постоянном сегменте вашей программы. Вот почему такой код

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

может дать истинное, одновременно & б может указывать на одном месте памяти. Но это выражение never сравнивает буквы «a», «b», «c» от a и b, оно сравнивает только указатели. Аналогично, в Java вы должны использовать str1.equals(str2), потому что оператор Java == также сравнивает интегральные сущности (числа, символы и «указатели на объекты»). В противоположном в C++, Python и других языках программирования с перегрузкой оператора, == для двух строк обычно приводит к символу путем сравнения символов.

Смежные вопросы