2013-05-15 10 views
5

Sto provando a eseguire un semplice programma C ma sto ricevendo questo errore: "avviso : formato '% s' aspetta tipo 'char ', ma l'argomento 2 ha tipo 'char () [20]'"C - avviso: il formato '% s' si aspetta tipo 'char *', ma l'argomento 2 ha tipo 'char (*) [20]'

dotati di Mac OS X Leone di montagna compilazione in terminale utilizzando gcc 4.2.1

#include <stdio.h> 

int main() 
{ 
    char me[20]; 

    printf("What is your name?"); 
    scanf("%s",&me); 
    printf("Darn glad to meet you, %s!\n",me); 

    return(0); 
} 

risposta

17
scanf("%s",&me); 

deve essere

scanf("%s",me); 

analitico:

"%s" significa che scanf si aspetta un puntatore al primo elemento di un array di char. me è una matrice di oggetti e può essere valutata come puntatore. Ecco perché è possibile utilizzare me direttamente senza aggiungere &. L'aggiunta di &-me saranno valutate al ‘char (*)[20]’ e la tua scanf è in attesa char *

critico Codice:

Utilizzando "%s" potrebbe causare un buffer overflow se la stringa di input dell'utente con lunghezza> 20. Quindi modificarlo a "%19s" :

scanf("%19s",me); 
+3

Sarebbe bello se tu spiegassi * perché * anche – Mike

+2

o '..., & me [0])', se vuoi davvero usare l'operatore '&'. – alk

+4

@Mike Perché ... Aspetta, l'avvertimento del compilatore ti dice chiaramente perché. –

3

Tranne quando è l'operando della sizeof, _Alignof, o unari & operatori, oppure i sa stringa letterale utilizzata per inizializzare un array in una dichiarazione, un'espressione di tipo "array di elementi N di T" verrà convertita ("decadimento") in un'espressione di tipo "puntatore a T" e verrà valutata come indirizzo del primo elemento dell'array.

L'array me è dichiarato come un array di 20 elementi di char; normalmente, quando l'espressione me viene visualizzata nel codice, verrà considerata un'espressione di tipo "puntatore a char". Se hai scritto

scanf("%s", me); 

allora non avresti ottenuto l'errore; l'espressione me sarebbe stata convertita in un'espressione del tipo corretto.

Utilizzando l'operatore &, tuttavia, è stata ignorata tale regola; invece di un puntatore a char, si sta passando un puntatore ad un serie di char (char (*)[20]), che non è quello che si aspetta scanf per l'identificatore %s di conversione, da qui la diagnostica.

+0

s/aggirato/preso un altro viale /, o qualcosa del genere, forse. A causa della regola, il risultato è diverso. +1 per la citazione, indipendentemente. – Sebivor

+0

Nota: '_Alignof' è stato un errore in N1570, stato rimosso nello standard. Questo ha senso, perché l'operando di '_Alignof' è un tipo,' _Alignof (type-name) ', non un'espressione arbitraria. –

+0

@DanielFischer Puoi per favore guardare in questo. L'anomalia a cui mi riferisco è piuttosto chiara. Si tratta dell'ultimo token, che si trova tra l'ultimo delimitatore e il carattere NULL, piuttosto che 2 delimitatori come richiesto per una stringa token - http: //stackoverflow.com/questions/16571060/strtok-issue-if-tokens-are-delimited-by-delimiters-why-is-last-token-between –

Problemi correlati