Я работал над примером в книге K&R C, где вас просят создать калькулятор RPN, который принимает ввод через аргументы командной строки. Мое решение, по сути, перебирает указанные аргументы и выдает ответ, но я кое-что заметил:
Если бы я дал символ умножения (звездочку) '*'
без одинарных кавычек, gcc предполагает, что это ввод с подстановочным знаком, поэтому мой ввод
$./rpn 5 10 *
Дает мне результат
read 5
read 10
read rpn
read rpn.c
= 0
Заключение звездочки в одинарные кавычки решает проблему.
$./rpn 5 10 '*'
read 5
read 10
read *
= 50
Мой вопрос: есть ли способ очистить ввод, чтобы моя программа не требовала, чтобы звездочка была заключена в одинарные кавычки, или это поведение вызвано чем-то более фундаментальным (например, двоичное выполнение Linux / POSIX / UNIX и обработка аргументов)?
2 ответа
Оболочка расширяет глобус перед выполнением программы. Вы цитируете глобус не из-за GCC, а из-за оболочки. Если вам не нужно такое поведение, используйте оболочку, которая не поддерживает глобусы.
Введите данные как
$./rpn "5 10 *"
Все аргументы в ""
и в программе вы получите все аргументы в argv[1]
, затем проанализируйте эту строку, разделив ее пробелом.
Таким образом, вам нужно обрабатывать любые подстановочные знаки / специальные символы особым образом.
rpn
.
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
#include <unistd.h>
иint main(void) { char *args[] = { "./rpn", "5", "10", "*", 0 }; execv(args[0], args); return -1; }
. Оболочка обычно расширяет*
; это позволяет избежать использования оболочки, поэтому расширения не происходит.*
в список всех файлов в текущем каталоге. Я, безусловно, должен быть более внимательным к оболочке.*
— единственный широко используемый арифметический оператор, который также является метасимволом оболочки. Если вы использовали круглые скобки с инфиксным калькулятором (по определению вы не используете круглые скобки с калькулятором RPN), то они тоже будут вам мешать, поскольку они также имеют особое значение для оболочки.bash -f
или введитеset -f
в запущенном Bash (иset +f
для отмены).