STRANEZZA...C E' VERAMENTE STANO

di il
15 risposte

STRANEZZA...C E' VERAMENTE STANO

Scusatemi sto studiando le strutture in c, e ho buttato giu questo codice:
/*Definire strutture atte a modellare:
1)l'anagrafica di uno studente.
2)l'anagrafica di un professore.
3)un personal computer
*/

#include<stdio.h>

//definizione di strutture
struct studente{
int anni;
char * nome,cognome;
int media;
};
struct professore{
int inAttivita;
char* nome,cognome;
char* materia;
};
struct pc{
char* motBoard,cpu,ram;
};

//dichiarazione delle funzioni
void studenti(int);
void professori(int);

int main()
{

//variabili
int nStudenti;
int nProfessori;
struct studente n1;

//richiesta numero studenti e professori
printf("Quanti studenti: ");
scanf("%d",&nStudenti);
printf("Quanti professori: ");
scanf("%d",&nProfessori);

//chiamata della funzione studenti
studenti(nStudenti);
}

//definizione della funzione di studenti
void studenti(n)
{

struct studente numero[n];

int i;

for (i=0;i<n;i++){
printf("studente n%d:\n",i+1);
printf("anni: ");
scanf("%d",&numero.anni);
printf("nome: ");
scanf("%s",numero.nome);
printf("cognome: ");
scanf("%s",numero.cognome);
printf("media: ");
scanf("%d",&numero.media);
}

for (i=0;i<n;i++){
printf("studente n%d: anni %d nome %s cognome %s media %d",i+1,numero.anni,numero.nome,numero.cognome,numero.media);
}
}

il problema sta che se lo eseguo cosi arrivo all' inserimento del nome e si blocca il programma
invece se inserisco la"&" nella scanf della richiesta del nome mi gira tutto

grazie per l'aiuto.

15 Risposte

  • Re: STRANEZZA...C E' VERAMENTE STANO

    Non è strano il C ... sei tu che non lo usi correttamente ...

    Non puoi usare un semplice puntatore (come char * nome) utilizzandolo in una scanf senza allocare lo spazio PRIMA per il nome stesso.

    In questo modo, scrivi casualmente in memoria e quello che capita è casuale (sembra funzionare ma non va bene oppure hai un crash ...).
  • Re: STRANEZZA...C E' VERAMENTE STANO

    oregon ha scritto:


    Non è strano il C ... sei tu che non lo usi correttamente ...
    Dovremmo usarlo come motto del forum!
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Scusatemi ma non ho capito bene perche inserire lo spazio prima del nome
    potete farmi un esempio
  • Re: STRANEZZA...C E' VERAMENTE STANO

    thorny84 ha scritto:


    scusatemi ma non ho capito bene perche inserire lo spazio prima del nome
    potete farmi un esempio
    oregon ti diceva che se tu dichiari un puntatore a char, prima di poterci scrivere qualcosa devi allocare esplicitamente lo spazio in memoria. Questa pratica si chiama allocazione dinamica e, in C, si fa con la funzione malloc.
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Si ho studiato l'allocazione dinamica
    ma come posso inserirla nel mio esercizio
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Thorny84 ... se hai studiato l'allocazione dinamica, mostraci come allochi lo spazio per il nome e per il cognome, perché il puntatore non basta ...
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Ok
    nome=(char*)malloc(__*sizeof char);
    non capisco come posso scrivere l'esatto numero di spazio da allocare prima del sizeof
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Quello lo devi sapere tu... O lo chiedi all'utente ("quanti caratteri vuoi inserire?") oppure allochi un po' di spazio e, se non è sufficiente, riallochi con dimensione maggiore.

    P.S. Non è consigliabile fare il cast del risultato della malloc.
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Non ce un modo dove prima chiedo il nome:
    scanf("%s",nome);
    e poi alloco dinamicamente lo spazio in memoria di nome per quanto effettivamente mi serve?
    no scusa ho scritto una cazzata.
    magari scrivendo cosi:
    nome=(char*)malloc(scanf("%s",nome)*sizeof char);
  • Re: STRANEZZA...C E' VERAMENTE STANO

    No... perché nel frattempo dove andresti a salvare quel nome?
    Puoi al limite avere un buffer temporaneo di dimensioni più che sufficienti dove "parcheggi" la stringa. Poi valuti la sua lunghezza, allochi lo spazio preciso e fai la copia.
  • Re: STRANEZZA...C E' VERAMENTE STANO

    thorny84 ha scritto:


    magari scrivendo cosi:
    nome=(char*)malloc(scanf("%s",nome)*sizeof char);
    Neanche, perché quando la scanf viene eseguita cerca di scrivere in "nome", ma questo non è stato allocato. Vedi il mio post precedente per una possibile soluzione.
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Si ci avevo pensato:
    char nomes [10];
    int n;
    scanf("%s",nomes);
    n=strlen(nomes);
    nome=malloc(n*sizeof char);
    e poi copiare con un strcpy nome con mones

    e giusto cosi?
  • Re: STRANEZZA...C E' VERAMENTE STANO

    Ma no ... cosa fai ...

    Non importa quanto spazio "sprechi" per il nome. L'allocazione non deve essere precisa al carattere.

    Hai due strade

    1) usi l'allocazione statica e non usi i puntatori e prevedi ad esempio 30 caratteri per il nome (+ il fine stringa)

    char nome[31];

    2) allochi dinamicamente 30 caratteri per il nome (+ il fine stringa)

    char *nome = malloc(31*sizeof(char));

    In seguito, al posto di usare la scanf, usa la fgets per controllare il numero di caratteri inseriti.
  • Re: STRANEZZA...C E' VERAMENTE STANO

    oregon ha scritto:


    Non importa quanto spazio "sprechi" per il nome. L'allocazione non deve essere precisa al carattere.
    Su questo sono d'accordo: nella quasi totalità dei casi la differenza è trascurabile!
Devi accedere o registrarti per scrivere nel forum
15 risposte