2013-12-11 3 views
6

Я пишу программу C о обратной польской нотации, которая берет ее операнды и операторы через аргументы командной строки. Но все происходит неправильно, когда возникает оператор умножения «*», и я не знаю, почему.
Вот небольшая программа для отладки.Неверный номер аргументов командной строки при передаче `*`

test.c

int main(int argc, char **argv) 
{ 
    printf("%d\n", argc); 
    return 0; 
} 

// run case   result 
    ./test a b   3 
    ./test *    66 

Так почему '*' аргумент делает неправильный результат?

+2

'*' имеют особое значение. – Maroun

+1

Оболочка расширяет '*' ко всем видимым файлам в каталоге, в котором вы запускаете программу, которую вы можете использовать только «x» в качестве оператора умножения – hetepeperfan

ответ

11

* делает оболочку glob. Таким образом, он будет распространяться на все файлы в вашем текущем каталоге, которые будут аргументами вашей программы, у вас есть 65 файлов в вашем каталоге. Вы можете видеть, что происходит, если вы запустите echo *

Вам нужно одной цитатой * как в ./test '*' (двойные кавычки будут работать тоже), это позволит предотвратить расширение оболочки *. A * предоставляется вашей программе в этом случае, оболочка удаляет одинарные кавычки.

Если вы хотите оценить выражения, вы могли бы сделать

./test 3 2 '*' 

В этом случае программа получает 3 дополнительных аргументов, разделенных таким образом argv[1] является 3, argv[2] является 2 и argv[3] является *

Или вы могли бы do:

./test '3 2 *' 

В этом случае ваша программа получает 1 дополнительный аргумент, argv[1] будет строка 3 2 *

+0

@ Bathsheba, точно! – Bin

+0

Значит, мне нужно разобрать '*' как *, -_- – Bin

+3

Нет, вам не нужно разбирать '' * ''как' * '. Это оболочка, которая изменяет '*' на список файлов в текущем каталоге и '' * ''(или' '*" ') только на' * '. Поэтому предоставление вашей программы '' * ''из оболочки даст вашей программе только один аргумент, содержащий' * 'без кавычек. – Shahbaz

8

Ваша командная оболочка обрабатывает * как подстановочный знак. Вероятно, он включает в себя все файлы в текущем каталоге: 60ish в вашем случае.

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