Visualizzazione dei risultati da 1 a 6 su 6

Discussione: C: esercizio struct

  1. #1
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316

    C: esercizio struct

    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

    codice:
    #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;
    }

  2. #2
    Quella sintassi non è valida: se tu volessi dereferenziare il char * di country dovresti scrivere:
    codice:
    *(table[i].country)
    infatti l'intera espressione table[i].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 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 [code] ... [/code], altrimenti perde l'indentazione; qui ho sistemato io, in futuro ricordatene.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    table[i].*country

    è scritto in modo sbagliato

    Deve essere

    table[i].country
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it L'avatar di leaf
    Registrato dal
    Oct 2012
    Messaggi
    316
    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:
    codice:
    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!

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da leaf
    ok grazie a entrambi, funziona..

    ma un'altra domanda. ...

    quindi perchè nell'esercizio è diverso?
    E' diverso perché nel caso di

    codice:
    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)

    codice:
    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
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.