Nella classe delle strutture dati che sto attualmente prendendo, ci è stato assegnato il compito di scrivere un web crawler in C++. Per darci un vantaggio, il professore ci ha fornito un programma per ottenere l'origine da un determinato URL e un semplice parser HTML per rimuovere i tag. La funzione principale per questo programma accetta argomenti e quindi usa argc/argv. Il codice utilizzato per controllare gli argomenti è il seguente:Perché controllare se (* argv == NULL)?
// Process the arguments
if (!strcmp(option, "-h"))
{
// do stuff...
}
else if (!strcmp(option, ""))
{
// do stuff...
}
else if (!strcmp(option, "-t"))
{
// do stuff...
}
else if (!strcmp(option, "-a"))
{
// do stuff...
}
if (*argv == NULL)
{
exit(1);
}
Dove "bottone" è stato popolato con l'interruttore in argv [1], argv [2] e superiore ha i restanti argomenti. Il primo blocco lo capisco bene, se l'interruttore è uguale alla stringa fai tutto ciò che è basato sull'interruttore. Mi chiedo quale sia lo scopo dell'ultimo blocco if.
Potrebbe essere che il mio C++ sia un po 'arrugginito, ma mi sembra di ricordare * argv che è equivalente a argv [0], in pratica significa che sta verificando che gli argomenti esistano. Tranne che avevo l'impressione che argv [0] sempre (almeno nella maggior parte delle implementazioni) contenesse il nome del programma in esecuzione. Mi viene in mente che argv [0] potrebbe essere nullo se argc è uguale a 0, ma cercando su Google non sono riuscito a trovare un singolo post che determini se sia o meno possibile.
E così mi rivolgo a voi. Che cosa è esattamente quel finale se il controllo dei blocchi?
EDIT: Sono andato con la motivazione fornita nei commenti della risposta selezionata, che può essere possibile per provocare intenzionalmente argv [0] a diventare NULL, o altrimenti diventano NULL basata su una piattaforma specifica implementazione di main.
Si noti che 'argv' non è un array, ma un puntatore. Ciò significa che puoi perfettamente dire "argv ++" per scorrere le opzioni. Non è necessario modificare il valore di * * argv'. –
Per curiosità, quale è stata la ragione del tuo professore quando glielo hai chiesto? – Daniel
Ora, 5 anni dopo, temo davvero di non ricordare. Mi sembra di ricordare vagamente di aver chiesto alla mia AT e il ragionamento è lo stesso dei commenti della risposta accettata (vedi la MODIFICA nella domanda), ma potrei fare questo e ricordare semplicemente tutto sbagliato. : P –