2012-07-30 16 views
7

Qualcuno può spiegarmi cosa non capisco qui per favore?passa char array come argomento

Sto cercando di passare l'argomento come una "stringa" (so che non ci sono stringhe in c) in modo che possa usare quella stringa in seguito con altre funzioni come è un nome di file che deve essere passato, per esempio. Ma non so il motivo per cui non lo accetterà o che tipo dovrebbe essere

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    char *array= argv[0]; 
    foo(*array); 
} 

void foo(char *array) 
// notice the return type - it's a pointer 
{ 
    printf(array); 
} 

grazie molto!

+0

si dereference di matrice durante il passaggio a foo. Quindi si passa solo il valore del primo byte se si tratta di una stringa c letterale – Lefteris

+0

Si dovrebbe evitare un'espressione come 'printf (s)' perché è una stringa di formato incontrollata. – md5

risposta

17

si dovrebbe essere chiamando la funzione come questa:

foo(array); 

Quello che stai facendo è dereferenziazione il puntatore, che restituisce un char, che è il primo carattere della stringa.

tuo printf chiamata dovrebbe anche apparire come segue:

printf("%s", array); 

l'intero codice fisso dovrebbe essere simile alla seguente:

#include <stdio.h> 

void foo(char *array) 
{ 
    printf("%s", array); 
} 

int main (int argc, char *argv[]) 
{ 
    // TODO: make sure argv[1] exists 
    char *array= argv[1]; 
    foo(array); 
} 
+0

ho rimosso l'asterisco come hai detto, non funziona ancora! Dice: ridefinizione: diversi tipi di base – Ryan

+0

Sì, questo è un problema completamente nuovo; usando 'printf' in modo errato. – chris

+0

ho fatto entrambe le correzioni, continua a dire la stessa cosa e non verrà compilata! – Ryan

5

Quando si dice foo (*array), si sta decadendo l'array in un puntatore al primo elemento, per dereferenziare quell'elemento, dandoti il ​​primo carattere. Questo è quello che stai cercando di passare alla funzione. Lasciare fuori l'asterisco e basta passare array per farlo decadere nel puntatore che ti serve.

L'altro problema è che non si sta utilizzando printf correttamente. Prima di tutto, ecco un reference. Devi passare una serie di token che dicono al compilatore quale tipo di argomento aspettarti dopo, perché non ha modo di dirlo. Nel tuo caso, la tua stringa conterrà "%s" per dirgli di aspettarsi un char *, e quindi passeresti array come argomento char *.

printf ("The string is %s", array); 
+0

ho rimosso l'asterisco come hai detto, non funziona ancora! Dice: ridefinizione: diversi tipi di base – Ryan

+0

ho notato che ti sei riadattato a come era prima? Ci sarà un asterisco nell'argomento passato alla funzione o no? In realtà ho appena notato con o senza di esso, non funzionerà – Ryan

+0

@Ryan, Non dovresti dereferenziare l'array decaduto da nessuna parte. È già decaduto nel puntatore necessario quando viene passato in una funzione. – chris

1

argv è un array di puntatori di caratteri, che significa argv sta per memorizzare l'indirizzo di tutte le stringhe che vi passato come argomento della riga di comando.

così argv[0] ti darà l'indirizzo della prima stringa che hai passato come argomento della riga di comando, che stai memorizzando nella variabile puntatore array nella funzione main.

Ora è necessario passare solo l'indirizzo alla funzione foo ma si passa il primo carattere di quella stringa. Ad esempio se il tuo primo argomento da riga di comando è temp.txt, stai passando il carattere t alla funzione foo. Quindi all'interno della funzione foo si ha una variabile del puntatore del char array, nel quale verrà assegnato il valore ASCII del carattere t. E quindi lo passi a printf, che calcola quel valore ASCII come indirizzo, e proverà ad accedere a quell'indirizzo per stampare che porterà ad un arresto anomalo (comportamento imprevisto).

Quindi è necessario passare solo l'indirizzo dell'argomento della riga di comando alla funzione foo come di seguito.

foo(array);

printf(array) - Qui printf sarà calcherà l'identificatore di formato come stringa (%s) e sarà cerca di stampare tutti i caratteri a partire dall'indirizzo array fino a che non incontra un carattere null \0.

Ma meglio aggiungere il printf come qui di seguito

printf("%s", array);

+0

spiegazione eccellente! Grazie! – Ryan

Problemi correlati