Preparazioni fondamenti, problema con le stringhe.

di il
7 risposte

Preparazioni fondamenti, problema con le stringhe.

Ciao a tutti.
venerdì ho l'esame di programmazione di informatica. mi sentivo abbastanza forte guardandomi intorno fin quando non mi sono procurato le prove d'esame e queste mi hanno abbattuto un po'. Sono qui a proporvi questo problema che non riesco a risolvere:
mi si chiede una funzione che, avendo un file su cui vi sono scritte varie operazioni del tipo:
3 + 4
7 * 21
56 /134

mi legga operazione per operazione le righe dal file e me le vada a mettere in una matrice senza gli spazi.
Sto trovando davvero tanti problemi per fare questa funzione.Ho provato tanti metodi che mi stanno suscitando tanta confusione. Ragionando:
La scanf si ferma ad ogni spazio. Io ho bisogno dell'intera riga. Devo escludere gli spazi. Nella compattazione delle stringhe non ho trovato altro se non questa cosa utile [^\n] che, credevo, mi leggesse tutto e si fermasse alle newline. Così ho pensato 'mi leggo le righe compresi gli spazi, e poi vedo di modificarle eliminando gli spazi, visto che direttamente leggendole dal file questa cosa non mi riesce. Nulla, il programma mi va in loop.
Allora nuovo problema, penso 'ok non mi funziona, ma perchè va in loop'? Mi è stato detto 'forse perchè lo scanf fermando allo newline non ti termina la stringa con '\0', ma io non penso! come farei a metterlo io alla fine di ogni stringa visto che ogni stringa è lunga diversamente dalle altre?
Ancora. Ho pensato di copiarmi ogni carattere uno ad uno compresi gli spazi per poi cercare di toglierli successivamente. Ma come faccio a fermarmi ogni qualvolta è terminata una operazione per poi passare alla riga successiva? (ricordo che ogni operazione dev'essere in una riga a parte).
Aiuto.

7 Risposte

  • Re: Preparazioni fondamenti, problema con le stringhe.

    Up
  • Re: Preparazioni fondamenti, problema con le stringhe.

    In un "mondo reale" adotteresti approcci diciamo così evoluti, cioè leggendo a blocchi il file ed esaminandolo a blocchi.

    essendo un esercizio per principianti puoi operare anche in modo lento (ma funzionale), ovvero leggendo un carattere alla volta dal file.
    Se il cattere è #10 o #13 (ipotizzando di voler funzionare con file di testo sia windows che *nix) allora la riga è finita, e devi elaborare una nuova riga (incrementi contatore e già che ci sei metti un #0 nella stringa memorizzata)
    Se il carattere è #32 lo togli (lo spazio), altrimenti memorizzi
    Attenzione alla dimensione del buffer (vettore? matrice più probabilmente) che allochi. In sostanza se prevedi di avere che so 100 righe di 30 caratteri ciascuno (massimo) allora controllerai che la stringa che stai componendo, al netto degli spazi, non sia più lungha di 29 caratteri (il 30esimo per lo #0 finale).
    E che non sia di più di 100 righe,altrimenti andresti in overflow.

    Sempre in un "mondo normale" potresti fare una funzione che legge tutto, ma con un flag del tipo "simula"
    Alla prima passata lo chiami con "simula", e ti fai tornare il numero delle righe e la lunghezza massima.
    poi allochi la matrice, e richiami la funzione sapendo che non avrai overflow.

    poi ci sono le variazioni: parti con una matrice di dimensioni di default, e se vai in overflow la ridimiensioni etc.etc.

    farei per quanto ti riguarda un passo alla volta
  • Re: Preparazioni fondamenti, problema con le stringhe.

    Perché non mostri questo codice che va in loop?

    Perché parli di scanf se l'input avviene da file?
  • Re: Preparazioni fondamenti, problema con le stringhe.

    Posto quello attuale, ho perso i mille tentativi vani..
        int i=0;
        char j,k;
        while(!feof(fpin))
        {
            j = fgetc(fpin);
            if (j=='\n') 
            {
                str[i][k]='\0';
                k=0;
                printf("%s\n",str[i]);
                i++;
            }
            else if (j==' ')
            {
                continue;
            }
            else 
            {
                str[i][k++] = j;
            }
        }
    ho tentato, invano, di fare quello che mi è stato consigliato,(i printf messi a caso sono per capire quali errori faccio).
    Il valore delle righe in uscita mi dice che è 4. Ovvero
    1 espressione
    riga vuota
    2 espressione
    riga vuota
    ..
    almeno le due righe sono senza spazi..!
    Perchè mi escono quelle due righe vuote nella mia matrice nonostante i controlli?
    E..soprattutto..la terza espressione del mio file?
  • Re: Preparazioni fondamenti, problema con le stringhe.

    E la scanf cosa c'entrava?
  • Re: Preparazioni fondamenti, problema con le stringhe.

    Perchè utilizzando il file intendevo la fscanf.. ma non mi sembra il caso di sottolineare sta cosa o.O
  • Re: Preparazioni fondamenti, problema con le stringhe.

    Mi sembra il caso invece, se vuoi che chi ti legge ci capisca qualcosa.

    Con la fscanf hai provato a leggere? Se c'è uno spazio puoi scrivere

    fscanf(fpin, "%d %c %d", &v1, &op, &v2);

    per leggere i 3 dati in due variabili intere e una di tipo char.

    Dopo ci fai quello che vuoi.
Devi accedere o registrarti per scrivere nel forum
7 risposte