* на командной строке Linux

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

5
задан Tom 9 February 2010 в 19:30
поделиться

8 ответов

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

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

  • Избегайте этого при вводе mycalc 5 \ * 3
  • Поместите все выражение в кавычки и убедитесь, что синтаксический анализатор калькулятора работает таким образом: myprog «5 * 3»
  • Не используйте командную строку: используйте вместо этого свой собственный ввод.
9
ответ дан 18 December 2019 в 06:02
поделиться

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

7
ответ дан 18 December 2019 в 06:02
поделиться

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

./yourprogram '10 * 10'

или

./yourprogram 10 '*' 10

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

6
ответ дан 18 December 2019 в 06:02
поделиться

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

3
ответ дан 18 December 2019 в 06:02
поделиться

Это самая первая ошибка Valgrind или есть предыдущие?

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

-121--4043383-

Не вижу свой код Nir, и у меня нет прав на редактирование, так что здесь он снова:

Секрет закладывается в endPlay с установкой: moveyPlayer.initialPlayBackTime = -1; перед выпуском. Попробуйте::)

-(void)playMovie:(NSString *)urlString{ movieURL = [NSURL URLWithString:urlString];          
moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];    
moviePlayer.initialPlaybackTime = 0; 
//Register to receive a notification when the movie has finished playing. 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(endPlay:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer];

moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
moviePlayer.movieControlMode = MPMovieControlModeDefault;
moviePlayer.backgroundColor = [UIColor blackColor];

[moviePlayer play];

}

-(void)endPlay: (NSNotification*)notification{
 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
moviePlayer.initialPlaybackTime = -1; 
[moviePlayer stop]; 
[moviePlayer release]; 
} 
-121--2823213-

Приложение «calc», которое можно извлечь из репозиториев deb apt-get install calc, может оценить 3 * 3, но не 3 * 3

0
ответ дан 18 December 2019 в 06:02
поделиться

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

Замените * на \*

-1
ответ дан 18 December 2019 в 06:02
поделиться

Последняя неупомянутая техника. Вместо кавычек/запятых при каждом использовании, вы можете отключить globbing. Таким образом, если вы хотите часто использовать калькулятор, вам не придется экранировать каждое использование:

# For bash
set -o noglob

# For csh/tcsh
set noglob

# Now that noglob is set, you can safely use *
calc 3 * 3
2
ответ дан 18 December 2019 в 06:02
поделиться

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

1
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: