Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [c] fgets+sscanf

  1. #1

    [c] fgets+sscanf

    Volevo sviluppare un programma che leggesse da file un numero e 2 nomi, li memorizzasse in apposite variabili e poi li stampasse.
    Il problema è che la sottospecie di programma che ho partorito, memorizza e stampa due volte il secondo nome.
    I dettagli tra i commenti al programma.


    #include<stdio.h>
    int main(int argv,char *argc[])
    {
    int num_al;
    FILE *fptr;
    char buff[15],*stringhe[2],stringa[15];
    fptr=fopen(argc[1],"r");


    fgets(buff,sizeof(buff),fptr); //prendo il numero e lo salvo in num_al
    sscanf(buff,"%d",&num_al);

    fgets(buff,sizeof(buff),fptr); //prendo il nome e lo passo a stringhe[0]
    sscanf(buff,"%s",stringa);
    stringhe[0]=stringa;
    printf("%s ",stringhe[0]); //stringhe[0] punta davvero a quel nome, infatti me lo stampa
    //correttamente

    fgets(buff,sizeof(buff),fptr); //prendo il secondo nome e lo passo a stringhe[1]
    sscanf(buff,"%s",stringa);
    stringhe[1]=stringa;


    //deve essere successo qualcosa a stringhe[0]_ ora contiene anch'essa un puntatore al secondo nome scannerizzato

    printf("numero alunni:%d; nome1:%s\n nome2:%s",num_al,stringhe[0],stringhe[1]); //infatti qui mi viene stampato due volte il secondo nome

    fclose(fptr);
    return 0;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Quando chiami la seconda sscanf() per leggere il secondo nome, fai uso sempre dello stesso puntatore "stringa" che hai usato per leggere il primo. Con la prima lettura, "stringa" punterà ad una certa stringa letta da tastiera, ad esempio "nome1", e viene poi assegnato l'indirizzo a "stringhe[0]"; con la seconda, l'area di memoria puntata da "stringa" sarà aggiornata a "nome2", ma allora anche "stringhe[0]", che puntava alla stessa area, punterà ora a "nome2" e non più a "nome1", che è stato cancellato... è per questo che ti viene stampato due volte lo stesso nome.

    Sembra contorto, ma ragionandoci un po' sopra risulta essere addirittura ovvio.

    PS: per cortesia, posta il codice usando i tag CODE come previsto dal regolamento di sezione, altrimenti non si capisce nulla.
    every day above ground is a good one

  3. #3
    Sì, effettivamente tutto torna.
    Ma allora come posso fare?
    Se volessi ad esempio riempire un intero vettore di puntatori a stringhe con un ciclo iterativo, non potrei ogni volta utilizzare un vettore diverso che svolga la funzione del vettore che nel mio programma ho chiamato "stringa".

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Puoi risolvere in diversi modi... puoi ricorrere a due puntatori diversi, oppure allocare spazio dinamicamente per stringhe[0] e stringhe[1] e passare direttamente quelli come terzo argomento delle sscanf(), oppure ancora allocare spazio staticamente così:

    codice:
       char stringhe[2][15];
       ...
       sscanf(buff, "%s", stringhe[0]);
       ...
       sscanf(buff, "%s", stringhe[1]);
    eliminando del tutto "stringa".
    every day above ground is a good one

  5. #5
    Grazie per l'aiuto!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.