2013-11-12 3 views
3

У меня есть программа, которая должна принимать несколько аргументов командной строки. Я дошел до стадии, где мне нужно настроить его для принятия аргумента n, который определяет максимальную и минимальную длины строки, которая в конечном итоге будет напечатана. В основном вход может выглядеть следующим образом:C++ Принятие аргумента командной строки с параметрами

-a -n7,7 -i // with -a and -i being other arguments 

Я в порядке с выбирая аргументы сами по себе, но я не уверен, как срывать эти максимальные и минимальные значения тоже. У меня был переход (см. Ниже), но всякий раз, когда я пытаюсь использовать переменные как минимум и максимум, я просто получаю ошибку времени выполнения. Привет, ребята.

int c; 
while ((c = getopt(argc, argv, ":wpsaevin")) != -1) { 
    switch (c) { 
     case 'w': // pattern matches whole word 
      mode = WHOLE; 
      break; 
     case 'p': // pattern matches prefix 
      mode = PREFIX; 
      break; 
     case 'a': // pattern matches anywhere 
      mode = ANYWHERE; 
      break; 
     case 's': // pattern matches suffix 
      mode = SUFFIX; 
      break; 
     case 'e': // pattern matches anywhere 
      mode = EMBEDDED; 
      break; 
     case 'v': // reverse sense of match 
      reverse_match = true; 
      break; 
     case 'i': // ignore case of pattern 
      ignore_case = true; 
      break; 
     case 'n': //Specifies word length 
      length_spec = true; 
      cin >> minimum >> maximum; 
      if (minimum == 0 && maximum == 0) { //no word limit 
       length_spec = false; 
      } else if (maximum == 0) { 
       maximum = 100; 
      } 
      break; 
    } 
} 
argc -= optind; 
argv += optind; 
+1

Я знаю, что не все хотят загружать boost, но я должен сказать, что boost_program_options собирается сделать этот 10000x более универсальным и менее подверженным ошибкам, если вы не возражаете, я бы опубликовал ответ с этим – aaronman

+2

'cin' читает от консоль, которая почти наверняка не то, что вы хотите. Если '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' находятся в командной строке после '-n', то местом для их получения является' argv [whatever] ' –

+0

Ха-ха, всякий раз, когда у меня возникает вопрос, люди всегда говорят мне, что есть более простые способы сделать это. К сожалению, я выполняю большую часть своей работы за задания, у которых есть спецификации, как мы должны заниматься вещами. – user2773084

ответ

3

From this page:

Эта переменная устанавливается Getopt, чтобы указать на значение аргумента опции , для тех вариантов, которые принимают аргументы.

case 'n': //Specifies word length 
      length_spec = true; 
      char *cvalue = optarg; 
      // TODO: Split cvalue by delimiter 
      // to obtain minimum and maximum 
      if (minimum == 0 && maximum == 0) { //no word limit 
       length_spec = false; 
      } else if (maximum == 0) { 
       maximum = 100; 
      } 
      break; 

И пример разбиения строки:

#include <iostream> 
#include <string> 
#include <algorithm> 

int 
main() 
{ 
    const char* test = "1000,2000"; 
    std::string str = std::string(test); 
    auto find = std::find(str.begin(), str.end(), ','); 
    std::string first = std::string(str.begin(), find); 
    std::string second = std::string(find+1,str.end()); 
    std::cout << first << " " << second; 
    // 1000 2000 
} 

EDIT

Reference link

Если вы можете использовать C++ 11, рассмотреть возможность использования std::stoi, например:

int first_int = std::stoi(first); 
    int second_int = std::stoi (second); 

Если нет, то попробуйте следующее:

std::replace(str.begin(), str.end(), ',', ' '); 
    std::istringstream ss(str); 
    ss >> first_int; 
    ss >> second_int; 
    std::cout << first_int << " " << second_int << std::endl; 

Я хотел бы использовать atoi в качестве последнего средства.

Наивный реализация может выглядеть следующим образом (использование на свой страх и риск):

int convert(std::string s) 
{ 
    int size = s.size(); 
    int exp = size - 1; 
    int result = 0; 
    for (int i = 0; i < size; i++) 
    { 
     char c = s[i]; 
     result += (int)(c - '0') * std::pow(10, exp--); 
    } 
    return result; 
} 
+0

Спасибо. Но я думаю, что я не уверен, как правильно собрать эти примеры. Я пробовал читать в строке, используя optarg, разбивая его с помощью разделителя, а затем преобразовывая обе части в int с помощью atoi. Я получаю ошибки, говорящие, что find не называет тип, и atoi не может преобразовать, среди прочих. – user2773084

+0

@ user2773084 OK Я сделал редактирование. –

+0

Спасибо. Я сделаю это. – user2773084

0

Вы можете использовать Boost, библиотека Program Options как @aaronman было предложено выше.

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