PDA

Visualizza la versione completa : C: esercizio struct


leaf
28-12-2012, 15:47
ciao, sto facendo un esercizio sulle strutture in C.
Questo qui sotto è il codice.
Praticamente l'utente inserisce un numero e se corrisponde ad uno dei paesi inseriti nella struct deve stampare il nome del paese cui corrisponde, altrimenti stampare un errore.
Al momento il terminale mi da questo errore:

"21:37: error: expected identifier before ‘*’ token"

la riga 21, è la riga della printf in cui deve stampare il nome del paese (una volta verificata la corrispondenza con il numero inserito dall'utente)

Grazie molte :)


#include <stdio.h>

int main(void) {

typedef struct {
char *country;
int code; } dial_codes;

dial_codes table[]=
{{"Argentina", 1}, {"France", 4},
{"Brazil", 2}, {"Italy", 5},
{"China", 3}, {"Mexico", 6}};

int i, n;

printf("enter code: ");
scanf("%d", &n);

for(i=0;i<=n;i++) {
if(i==n)
printf("%d is %s\n", n, table[i].*country); //questa è la riga dell'errore
return 1;
}
printf("error. code not found. retry.\n");
return 0;
}

MItaly
28-12-2012, 16:00
Quella sintassi non è valida: se tu volessi dereferenziare il char * di country dovresti scrivere:


*(table[i].country)

infatti l'intera espressione table[/b]].country ti restituisce un char *, per cui se vuoi dereferenziare il puntatore in questione devi piazzare l'asterisco prima di tutta l'espressione.

In ogni caso, in realtà non devi dereferenziare niente: lo specificatore "%s" già si aspetta già un char * (ovvero, un puntatore al primo carattere della stringa da stampare), per cui non ci devi fare niente.

Per inciso, dato che inizializzi le struct in questione con delle stringhe literal (=specificate direttamente nel codice) sarebbe opportuno che il membro country della struttura fosse un [i]const char *, dato che i literal non devono essere modificati (pena crash del programma o comportamenti anomali).

---

Tra parentesi, il codice va formattato con i tag
... , altrimenti perde l'indentazione; qui ho sistemato io, in futuro ricordatene.
:ciauz:

oregon
28-12-2012, 16:00
table[i].*country

è scritto in modo sbagliato

Deve essere

table[i].country

leaf
29-12-2012, 10:32
ok grazie a entrambi, funziona..

ma un'altra domanda. Io ho scritto il * prima di country perchè ho pensato di dover stampare il valore puntato dal puntatore..perchè questo ragionamento in questo caso è sbagliato? di solito per stampare il contenuto puntato di un puntatore si fa così che io sappia:

printf("%d", *p);

quindi perchè nell'esercizio è diverso?

per il tag [code], non sapevo, ho cercato qualche cosa nel riquadro del messaggio per fare questa cosa mentre scrivevo il messaggio ma non ho trovato niente..grazie dell'indicazione..

ciao! :)

oregon
29-12-2012, 11:29
Originariamente inviato da leaf
ok grazie a entrambi, funziona..

ma un'altra domanda. ...

quindi perchè nell'esercizio è diverso?

E' diverso perché nel caso di


printf("%d", *p);

visualizzi il valore intero puntato da p (e alla printf devi fornire tale valore non il puntatore al valore), mentre nel caso precedente si trattava di una stringa (lo vedi da %s nella printf)


printf("%s", table[i].country);

e quindi devi fornire il puntatore alla stringa che è identificato direttamente dall'elemento country (puntatore alla stringa).


nel riquadro del messaggio

C'è un apposito tasto CODE

MItaly
29-12-2012, 15:00
In altri termini:
quando tu vuoi stampare un intero, quello che vuoi passare alla printf è, appunto, una variabile intera; una stringa, invece, è un array di caratteri (terminato dal carattere '\0'), per cui, perché la printf possa stamparla interamente, non puoi passarle solo il primo carattere, ma devi fornirle un puntatore al primo carattere (char *) in modo che possa leggere anche i caratteri che seguono e stampare quindi tutta la stringa.

Se non ti è chiaro questo concetto, dovresti rivedere il capitolo relativo alle stringhe del tuo libro di C.

Loading