аргументы командной строки argv и argc - PullRequest
0 голосов
/ 23 сентября 2019

Я понимаю, что argc подсчитывает количество аргументов, а argv принимает аргумент, но это их способ, которым я могу определить, был ли мой аргумент из argv введен в определенном формате, как в скобках, а не вскобка.Такие как ./a.out "Hello Word" и ./a.out Hello World?

1 Ответ

1 голос
/ 23 сентября 2019

Да и нет.По сути, единственный способ сделать это - сравнить строки с помощью функции, подобной strcmp.Однако одна вещь, которая усложняет дело, заключается в том, что используемая оболочка может удалить кавычки, прежде чем ваша программа сможет их увидеть.Что еще хуже, то, как это обрабатывается, зависит от оболочки, поэтому то, что работает для одной оболочки, может не сработать для другой.Оболочки Posix (sh, bash, ksh и т. Д.) Обрабатывают кавычки таким же образом и не предлагают никакого способа его обнаружения.

Эта программа:

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("Number of arguments: %d\n", argc);
    for(int i=0; i<argc; i++)
        printf("Argument %d: %s\n", i, argv[i]);
}

выдает этот вывод длязвездочка в качестве аргумента при использовании оболочки bash:

/tmp/test$ ./a.out *
Number of arguments: 3
Argument 0: ./a.out
Argument 1: a.out
Argument 2: main.c

Это связано с тем, что * распространяется оболочкой на все файлы в текущем каталоге.Кавычки обычно группируют вещи, которые иначе рассматривались бы как два разных аргумента.Если вы хотите передать кавычки в bash, вы можете избежать их.

/tmp/test$ ./a.out "Hello world"
Number of arguments: 2
Argument 0: ./a.out
Argument 1: Hello world

/tmp/test$ ./a.out \"Hello world\"
Number of arguments: 3
Argument 0: ./a.out
Argument 1: "Hello
Argument 2: world"

Так что ответ, к сожалению, нет.Для этого нет общего метода.Некоторые оболочки могут предоставлять инструменты для этого, но на это нет гарантии, и даже если они это делают, стандартного способа сделать это не существует.

...