2015-12-03 2 views
1

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

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

    int x = checkNum(argv[1]); 
    int y = checkNum(argv[3]); 
    int o = checkOP(argv[2]); 
    … 
} 

Предполагается, что калькулятор так, например, в командной строке, когда я пишу:

program.exe 4 + 2 

и это даст мне ответ 6 (код для этого не включен).

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

program.exe 3 * 4 

Похоже, что это создает указатель (или что-то, не совсем уверен) вместо того, чтобы дать мне указатель обугленного к полукоксу ' * '.

Вопрос: могу ли я получить вход «*», чтобы вести себя так же, как при вводе «+»?

Редактировать: Запись "*" в командной строке работает. Есть ли способ, когда мне нужно только ввести *?

Код работает под управлением Windows, что, как представляется, является частью проблемы.

+4

try '3" * "4', если это работает, это не ваша проблема, а проблема вашего терминала/командной строки. в этом случае рассмотрите возможность ввода всего выражения в виде одной строки в кавычках ... – BeyelerStudios

+4

Возможно, вам придется процитировать ее. Например: 'program.exe 3" * "4'. Конечно, вам нужно будет делать в Unix (включая Linux и OS X), потому что '*' имеет специальное соответствие шаблону для оболочки. Ваше имя программы предполагает, что вы работаете в Windows, и там * * используется *, чтобы программы отвечали за выполнение собственного подталкивания. Возможно, это изменилось. –

+0

Спасибо за ваш ответ! Я пробовал это, и он работает, так что теперь вопрос в том, можно ли обойтись без написания «». Будет ли редактировать сообщение – Frostbite

ответ

2

Вы можете отключить оболочку, если вы не хотите использовать одиночную кавычку (') или двойную кавычку (").

ли

# set -o noglob 

или

# set -f 

(оба эквивалентны).

, чтобы выключить оболочку. Теперь оболочка не будет расширять любые глобусы, включая *.

7

Как писал @JohnBollinger в комментариях, вы должны использовать

/path/to/program 3 '*' 4 

так, как это написано в данный момент.

Но, безусловно, требуется некоторое объяснение. Это связано с тем, что оболочка будет анализировать командную строку перед ее передачей в вашу программу. * будет расширяться до любого файла в каталоге (UNIX) или чего-то подобного (окна), разделенного пробелом. Это не то, что вам нужно. Вы не можете исправить это в своей программе, поскольку будет слишком поздно. (В UNIX вы можете убедиться, что находитесь в пустой директории, но это, вероятно, не помогает).

Другим способ обойти это процитировать весь аргумент (и перепишет программировать соответственно), т.е.

/path/to/program '3 * 4' 

в этом случае вам нужно будет использовать strtok_r или strsep к пошагово (один) переданного аргумента , отделяя его от пространства (ов).

+0

Хорошо, спасибо за объяснение и ваше время! Я ценю это – Frostbite

6

Как оболочка обрабатывает аргументы командной строки за пределами области действия и управления вашей программой. Нет ничего, что можно было бы включить в программу, чтобы сообщить оболочке обойтись без какого-либо нормального поведения при обработке команд.

Я полагаю, однако, что вместо того, чтобы полагаться на оболочку для разбиения слов, вы делаете свою программу ожидающим целого выражения как единого аргумента и для этого для синтаксического анализа выражения. Это не избавит вас от необходимости цитаты, но это будет сделать в результате команды выглядят более естественно:

program.exe 3+4 
program.exe "3 + 4" 
program.exe "4*5" 

Это также поможет, если вы расширить вашу программу для обработки более сложных выражений, например, те, которые содержат круглые скобки (которые также значительны для оболочки).

+0

Спасибо, подумал, что это может быть где-то вдоль этой линии, и это имеет смысл! – Frostbite

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