Pracowałem nad przykładem w książce K R K &, w której prosi się o zbudowanie kalkulatora RPN, który pobiera dane wejściowe za pośrednictwem argumentów wiersza poleceń. Moje rozwiązanie zasadniczo iteruje za pośrednictwem podanych argumentów i wypluwa odpowiedź, ale zauważyłem coś:argv: dezynfekcja symboli wieloznacznych
Jeśli miałbym podać znak mnożenia (gwiazdkę) '*'
bez pojedynczych cudzysłowów, gcc zakłada, że jest to znak wieloznaczny, więc mój wkład
$./rpn 5 10 *
daje mi moc
read 5
read 10
read rpn
read rpn.c
= 0
owijania gwiazdkę z apostrofami środków zaradczych emisji
$./rpn 5 10 '*'
read 5
read 10
read *
= 50
Moje pytanie brzmi: czy istnieje sposób na dezynfekcję danych wejściowych, aby mój program nie wymagał oznaczania gwiazdką pojedynczych cudzysłowów, czy też jest to zachowanie spowodowane przez coś bardziej fundamentalnego (np. Wykonywanie binarne Linux i POSIX/UNIX i obsługa argumentów)?
Cholernie dobre pytanie. – Qix
Wszystko, co trzeba zrobić z powłoką; nie ma nic wspólnego z kompilatorem C. Aby zademonstrować, spróbuj napisać mały program: '#include' i 'int main (void) {char * args [] = {" ./rpn "," 5 "," 10 "," * ", 0}; execv (args [0], args); return -1; } '. Powłoka zwykle rozszerza '*'; dzięki temu unika się używania powłoki, więc nie występuje ekspansja. –
GCC nic nie wie. Powłoka jest tą, która zasila wejście do twojego programu. –