2010-02-09 7 views
5

Я делаю маленький калькулятор в C, и я хочу передать простые арифметические формулы в свою программу. Но мне действительно не нравится, когда я передаю персонаж '*' моей программе. Почему бы и нет? И как я могу обойти это без изменения звездочки на что-то еще? Спасибо* в командной строке linux

ответ

9

Символ * - это триггер оболочки для расширения совпадающих имен файлов.

Есть несколько способов борьбы с ним:

  • экранировать при вводе mycalc 5 \* 3
  • Поместите все выражение в кавычки и убедитесь, что анализатор калькулятор работает таким образом: myprog "5 * 3"
  • Не используйте командную строку: вместо этого используйте свой собственный вход.
+3

ИЛИ: всегда запустить его в пустом каталоге :) –

+2

Интересной идеи. Он может быть продан как выделенный * расчетный каталог *. Или, может быть, * безопасная среда расчета *. :-) – wallyk

+0

Зависит от оболочки. В то время как Bash по умолчанию оставляет glob нерасширенным, если он ничего не соответствует, его можно настроить для удаления glob ('shopt -s nullglob') или сбой всей команды (' shopt -s failglob').В других оболочках, например, 'tcsh', последнее поведение по умолчанию. – ephemient

3

Командная оболочка Linux (bash, tcsh, ksh, whatever) расширит '*' до списка файлов, прежде чем ваша программа даже увидит ее. Вы можете сделать это очень мало - вы могли бы поместить звездочку в одинарные кавычки или избежать ее с помощью обратного слэша или вместо этого использовать «x». Никто не особенно удобен для пользователя.

7

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

1

* оценивает «все в текущем каталоге» под bash. Однако . работает правильно и часто используется как символ умножения в математике - в частности, скалярное умножение.

6

* будет вызывать универсализации и расширения всех файлов в каталоге вы находитесь. Просто цитирую * и запустить программу как

./yourprogram '10 * 10'

или

./yourprogram 10 '*' 10

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

0

«известково» приложение, которое можно извлечь из Деб репозиториев APT-получить установку известково можно оценить 3 * 3, но не 3 * 3

-1

Попробуйте избежать этого, звездочка специальный символ в C

Изменить * to \ *

2

Один последний способ не упоминается. Если вы хотите использовать кавычки или избегать каждого использования, вы можете отключить флешинг. Таким образом, если вы хотите использовать калькулятор много, вам не придется бежать каждое использование:

# For bash 
set -o noglob 

# For csh/tcsh 
set noglob 

# Now that noglob is set, you can safely use * 
calc 3 * 3 
+0

+1 - Лучше запустить «calc» в сценарии оболочки, чтобы пользователь мог наслаждаться более естественным языковым вводом. Также очень полезно при вводе входных данных из файла. –

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