Используя argv в C?

Для присвоения я обязан иметь параметры командной строки для своей программы C. Я использовал argc/argv прежде (в C++) без проблемы, но я не уверен, если строки стиля C влияют, как это работает. Вот запуск моего основного:

int main(int argc, char *argv[]){

  if(argc>1){
    printf("0 is %s, 1 is %s\n",argv[0],argv[1]);
    if(argv[1]=="-e"){
        // Do some stuff with argv[2]
        system("PAUSE");
    }
    else{
        printf("Error: Incorrect usage - first argument must be -e");
        return 0;
    }
  }

Таким образом, я называю свою программу как "program.exe-e myargstuff", но я получаю "Ошибку: Неправильное Использование..." вывод, даже при том, что мой printf () говорит мне, что argv[1] является "-e". Некоторая справка?Спасибо!

7
задан Joe 20 February 2010 в 02:07
поделиться

6 ответов

Строка

if(argv[1]=="-e"){

сравнивает указатели, а не строки. Вместо нее используйте функцию strcmp:

if(strcmp(argv[1],"-e")==0){
16
ответ дан 6 December 2019 в 05:43
поделиться

Change:

if(argv[1]=="-e"){

to

if(strcmp(argv[1], "-e") == 0){

and include string.h.

6
ответ дан 6 December 2019 в 05:43
поделиться

Вот как вы это делаете. Или хотя бы его наивное решение.

Сначала номера упорядочиваются по возрастанию. Предполагая, что A - упорядоченный список результатов, а S - набор минимальных чисел, из которых можно построить A.

Loop through A. Пока не существует подмножества S, которое складывается в i добавить новое число к S так, что это так.

При первой итерации добавляется мин (А). Второе число, вероятно, будет в S. Это достаточно вычислительно интенсивно, потому что для каждого числа, которое вы исследуете в A, вам нужно будет убедиться, что существует подмножество S, которое добавляет к нему и что вы не добавляете число, которое создает подмножество S, которое добавляет к чему-то в A.

Вы можете оптимизировать это несколько, каждый раз, когда вы добавляете число к S, вы отрабатываете все возможные суммы, включая этот новый элемент и удаление их из A. Продолжайте идти, пока вы не опустите A.

Это усложняется, если числа могут быть отрицательными, но вы увидите это, потому что будет должен быть отрицательный элемент A, чтобы это было возможно.

-121--3003426-

Строка

if(argv[1]=="-e"){

сравнивает указатели, а не последовательности. Вместо этого используйте функцию strcmp :

if(strcmp(argv[1],"-e")==0){
-121--3768752-

Невозможно сравнить c-строки. Используйте strcmp (ссылка здесь ).

Поскольку c-строки фактически являются указателями, оператор = = сравнивает адрес первого символа, который в этом случае никогда не будет равен.

3
ответ дан 6 December 2019 в 05:43
поделиться

Ознакомьтесь с getopt () и связанными функциями; это сделает вашу жизнь намного проще.

5
ответ дан 6 December 2019 в 05:43
поделиться

Вы не можете использовать == для сравнения таких строк в C. Это просто сравнение адресов argv[1] и вашего литерала, которые практически гарантированно будут разными.

Вместо этого используйте strcmp. например:

if (!strcmp("-e", argv[1])) {
2
ответ дан 6 December 2019 в 05:43
поделиться

В прототипе функции main говорится, что вы имеете дело с указателями char * . В C нет перегрузки оператора; следовательно, == между двумя char * проверит, указывают ли они на одно и то же место . Это не так, да и так бывает редко. Используйте функцию strcmp (ссылка на функцию действительна, даже если она указывает на сайт C ++) из :

strcmp(argv[1], "-e") == 0
1
ответ дан 6 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: