Leggere una sequenza di parole

di il
4 risposte

Leggere una sequenza di parole

Ciao,
ho un problema con la scanf, come faccio a leggere una serie di parole in input?
Mi spiego meglio, all'inizio chiedo all'utente la lunghezza delle parole, che è uguale per tutte le parole, poi devo leggere la sequenza di parole di lunghezza arbitraria e questo ultimo punto non riesco a farlo.
Avevo pensato di usare un ciclo while e leggere con lo scanf, ma non funziona. Qualcuno ha qualche consiglio su come fare?


Grazie

4 Risposte

  • Re: Leggere una sequenza di parole

    Se posti quello che hai fatto, vediamo cosa non va.
  • Re: Leggere una sequenza di parole

    Dopo una serie di tentativi sono riuscita a così:
     #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define LUNG 512
    
    int main() {
    
          char *s = calloc(LUNG, sizeof(char));
          const char spz[2] = " ";
          char *token;
    
          fgets(s, LUNG, stdin);
    
          token = strtok(s, spz);
    
          while( token != NULL ) {
                printf( "%s\n", token );        
                token = strtok(NULL, spz);
          }
          
          free(s);
    
          return (0);
    }
    Però la calloc me l’hanno sconsigliata di usare perché devo creare un programma abbastanza ottimizzato. Avete dei suggerimenti su come modificare il codice e ottimizzarlo sia a livello di tempo che di spazio?
  • Re: Leggere una sequenza di parole

    Usa la malloc
  • Re: Leggere una sequenza di parole

    Sicuro di volerlo fare in C?
    Io con la libreria standard del C++ farei così:

    NOTA:
    Scrivendo ":q" si conclude l'acquisizione dei dati
    
    #include <iostream>  // mi serve per avere gli stream di I/O
    #include <string>       // la libreria string della STL
    #include <vector>      // mi consente di non gestire a manina l'allocazione della memoria
    
    int main(void)
    {
    std::vector<std::string> a; // array di appoggio dove metto le stringhe lette
    std::string s; //stringa di appoggio
    while(s != ":q") //questo mi serve per non uscire ogni volta che trovo un eol ma solo se ricevo :q
        while((std::cin >> std::ws >> s) && s != ":q") // leggo il valore da stdin, lo purgo dai whitespace e lo metto in s, se s vale ":q" smetto di girare
            a.push_back(s); //metto il valore in memoria 
    
    //stampo i token letti uno per riga
    for (const auto &w : a){
    std::cout<<w<<std::endl;
    }
    std::cout<<"vector is "<<(a.empty()?"empty":"full")<<std::endl;
    a.clear(); //pulisco il vettore di appoggio
    std::cout<<"vector is "<<(a.empty()?"empty":"full")<<std::endl;
    
    }
    
Devi accedere o registrarti per scrivere nel forum
4 risposte