Non hai inizializzato pass
per puntare a un buffer o in un'altra posizione per memorizzare l'ingresso.
Per qualcosa di semplice come questo, è possibile dichiarare pass
come un array di char
invece di un puntatore:
char pass[N]; // where N is large enough to hold the password plus a 0 terminator
scanf("%s", pass);
if (strcmp(pass, "acopio") == 0)
{
...
}
Tranne quando è l'operando della sizeof
, _Alignof
, o unari &
operatori, o è una stringa letterale utilizzata per inizializzare un'altra matrice in una dichiarazione, un'espressione di tipo "Serie N-elemento di T
" verrà convertita ("decadimento") in un'espressione di tipo "puntatore a T
" e il valore di l'espressione sarà l'indirizzo del primo elemento dell'array.
Quando si passa pass
come argomento per scanf
e strcmp
, il tipo di espressionepass
viene convertito da "N-elemento array di char
" a "puntatore a char
", ed il valore dell'espressione è il indirizzo del primo elemento di pass
o &pass[0]
.Ecco perché non è necessario utilizzare l'operatore &
nella chiamata scanf
.
Analogamente, nella chiamata strcmp
, la stringa letterale "acopio" viene convertito da un'espressione del tipo "7-elemento array di char
" (const char
in C++) per "puntatore a char
".
fonte
2012-11-06 15:01:08
Perché -1? Sto imparando; ho cercato di trovare la risposta qui; e per i principianti non è facile capire altre risposte. – jotape