2013-09-27 2 views
-1

Я разрабатываю программу командной строки с использованием unordered_map и char * в C++.C++ неупорядоченная карта для хранения параметров командной строки

Однако, это не работает.

Вот мой код.

#include "stdafx.h" 
#include <unordered_map> 

int main(int argc, char *argv[]) 
{ 
    std::unordered_map <char*, char*> hash; 

    for (int i = 1; i<argc; i++){ 
    if (argv[i][0] == '-'){ 
    hash[argv[i]] = argv[i+1]; 
    } 
} 

if (hash["-file"]){ 
    printf("Openning the file %s \n", hash["-file"]); 
}else{  
    printf("Error open files \n"); 
    return 0; 
} 

}

Когда я обеспечиваю мои списки arguement:

myprogram.exe -file "c:\myfile.txt" -option1 ..... 

Он не может открыть входной файл.

Может ли кто-нибудь помочь мне с этим?

Большое спасибо

+4

Я собираюсь просто рассказать вам, что «символ», который вы передаете, как ваш * lookup * ключ * не * тот же фактический адрес, который находится в качестве ключа на вашей карте, используемой в качестве ключа * вставки *. Один из них - 'argv []', другой - литерал только для чтения. В * большинстве случаев, указатели ** не **, что вы хотите для ключей. (есть ситуации, когда это полезно, но это не один из них, очевидно). Джон кратко рассказал об этом здесь, и он может прийти как ответ; используйте 'std :: string' как тип ключа для вашей карты. – WhozCraig

ответ

1

Как сказал @WhozCraig в комментарии, вам нужно использовать std::string вместо char* в качестве основного типа в вашей карте. Вы можете использовать char * как тип значения, так как argv имеет срок службы всей программы.

Однако, если вы можете использовать Boost, их библиотека параметров программы лучше, чем любая из этих рукописных материалов. К сожалению, поскольку вы, кажется, используете Windows, ваша платформа не предоставляет никаких встроенных файлов, таких как getopt_long(), но Boost PO - лучшее средство для этого на C++.