Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 10-08-2009, 22:34   #1
Y3PP4
Member
 
Iscritto dal: Jul 2009
Messaggi: 210
[C] Problema ciclo for dentro un ciclo while

Giorno,

sto facendo delle prove scrivendo un piccolo parser (niente di chè, solo escape di stringhe).
Attualmente ho messo a punto un algoritmo semplice semplice che prevede tramite un
while(!feof( fp )) la chiamata a varie funzioni, una delle quali è fgets.
Ottenuta la stringa poi passo tutto a un'altra funzione che tramite un ciclo for così definito:
Codice:
for( i=0; i<strlen( line ); i++ )
richiama continuamente uno switch(line[i]) e in seguito testa: se il carattere non è una tabulazione o spazio lo salva in un'altro puntatore e al termine del ciclo for ritorna la stringa.

Qui sorge il problema. Se provo a stampare le varie stringhe ottengo tutto con successo, ma ahimè l'ultima linea mi viene stampata due volte.

Qualcuno sà da cosa possa dipendere il problema?

Di seguito posto il problema semplificato (per non complicare le cose):
Codice:
// importo gli header necessari
void cleanString( char *line, char *escapedLine );
int main()
{
    // ... fp è argv[1]
    char line[500];
    char *escapedLine;
    while( !feof( fp ) )
    {
        fgets( line, sizeof( line ), fp );
       // alloco la memoria
        escapedLine = malloc ( strlen( line ) + 1 ) * ( sizeof( char ) ) );
        cleanString( line, escapedLine ); // 
        printf("%s\n", escapedLine);
        free( escapedLine );
    }
    return( EXIT_SUCCESS );
}
void
cleanString( char *line, char *escapedLine )
{
    unsigned int i;
    unsigned int a = 0; //  counter per cleanLine
    for( i=0; i<strlen( line ); i++ )
    {
        switch( line[i] )
        {
            case ' ' :
            case '\t':
            case '\n':
                break;
            default:
                cleanLine[a] = line[i];
                a++;
                break;
        }
    }
    return;
}
Questo è quanto.
Supponendo di avere un file con semplici frasi come potrebbe essere:
Giorno a tutti,
oggi mi sento
bene.

Ottengo come risultato:
Giornoatutti,
oggimisento
bene.
bene. <-- ripetuto due volte!

Grazie a tutti, buona notte.

Ultima modifica di Y3PP4 : 10-08-2009 alle 22:37.
Y3PP4 è offline   Rispondi citando il messaggio o parte di esso
Old 10-08-2009, 23:54   #2
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Imposta il primo carattere della stringa a '\0' prima di leggere con fgets(), visto che è un buffer statico, dovrebbe bastare.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2009, 01:15   #3
Y3PP4
Member
 
Iscritto dal: Jul 2009
Messaggi: 210
Grazie mille per la risposta

Il sistema funziona (mi stampa solo un'ultima riga bianca ma dato che non dovrò stamparlo ed è un carattere nullo non dovrei avere problemi col parser...)

Come mai bisogna usare questo escape (o hack che dir si voglia) ?
Io avevo esplicitamente detto:
"mentre non incontri la fine del file -> leggi una riga -> leggi ogni carattere della riga -> se non è uno spazio mettilo da parte -> ritornami tutti i caratteri messi da parte -> stampa i caratteri ritornati"

Esegue palesemente un ciclo in più (in cui mi pare di capire che la stringa rimane inalterata) di quello richiesto...
inoltre perchè la stringa rimane immutata? non è dichiarata come static...

chiedo scusa ma alla solita se è possibile vorrei chiarire il concetto

Buona notte e mille grazie ancora!
Y3PP4 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2009, 01:48   #4
nuovoUtente86
Senior Member
 
Iscritto dal: Mar 2007
Messaggi: 7863
effettua una prima fgets fuori dal while e posiziona la chiamata come ultima istruzione del while in modo da sincronizzare con feof la posizione sullo stream.
nuovoUtente86 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2009, 08:12   #5
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da Y3PP4 Guarda i messaggi
Esegue palesemente un ciclo in più (in cui mi pare di capire che la stringa rimane inalterata) di quello richiesto...
inoltre perchè la stringa rimane immutata? non è dichiarata come static...
Perché finché non "fallisce" per la prima volta la fgets() non ti viene dato l'EOF, quindi l'ultimo ciclo sarà quello in cui la fgets() non avrà più niente da leggere. Il problema era che il tuo buffer era un'array dichiarata come variabile locale, che nasce e muore con la funzione in cui è stata dichiarata: al termine di ogni ciclo, i vecchi contenuti non vengono cancellati (al limite devi terminare tu a mano la stringa, come ti ho consigliato di fare io), e quindi nell'ultimo ciclo prima dell'EOF ottieni comunque la riga che già era dentro il buffer.
Alternativamente, puoi fare come consiglia nuovoUtente86 ed ottenere lo stesso effetto.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2009, 22:26   #6
Y3PP4
Member
 
Iscritto dal: Jul 2009
Messaggi: 210
Anzitutto mille grazie ad entrambi per la risposta.
Mille grazie nuovoUtente86 per il suggerimento, adesso che me lo hai esposto, tra l'altro, sembra la soluzione ad hoc al problema, mi sarà molto utile : grazie mille!

Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Perché finché non "fallisce" per la prima volta la fgets() non ti viene dato l'EOF, quindi l'ultimo ciclo sarà quello in cui la fgets() non avrà più niente da leggere. Il problema era che il tuo buffer era un'array dichiarata come variabile locale, che nasce e muore con la funzione in cui è stata dichiarata: al termine di ogni ciclo, i vecchi contenuti non vengono cancellati (al limite devi terminare tu a mano la stringa, come ti ho consigliato di fare io), e quindi nell'ultimo ciclo prima dell'EOF ottieni comunque la riga che già era dentro il buffer.
ciao
Ancora una volta mi hai illuminato con una esposizione chiarissima: ti sono (nuovamente) debitore! Adesso mi è tutto chiaro;
soprattutto perchè dare il fine stringa al primo carattere prima dello fgets.
Grazie mille (inoltre mi sono chiarito anche il fatto che feof "cattura" un eof settato da un'altra funzione e non lo setta da solo).

Buona serata a tutti :-).
Y3PP4 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2009, 23:07   #7
Y3PP4
Member
 
Iscritto dal: Jul 2009
Messaggi: 210
Uh, un'ultima cosa che mi era sfuggita.
Io dealloco la memoria con free(fp)... se libero la memoria contenente la stringa come fà ancora a restare in memoria nel ciclo successivo?

Solo una piccola curiosità



Buona serata,
ciao.
Y3PP4 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2009, 23:46   #8
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Perché la prendi da line e ce la ricopi dentro (la fgets() opera sulla line allocata staticamente, non sulla escapedString allocata dinamicamente).

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2009, 00:00   #9
Y3PP4
Member
 
Iscritto dal: Jul 2009
Messaggi: 210
Quote:
Originariamente inviato da DanieleC88 Guarda i messaggi
Perché la prendi da line e ce la ricopi dentro (la fgets() opera sulla line allocata staticamente, non sulla escapedString allocata dinamicamente).

ciao
....

non ho parole: se mi scordo pure come funzionano gli algoritmi più semplici che scrivo pochi giorni prima, sarà meglio che ricorra ad una cura di fosforo.
Il fatto (a mia giustificazione ) è che nel programma uso un puntatore ad una sequenza di comandi (dichiarati come puntatori a funzione) per usare anzichè ad esempio fgets(...);
parser->getLine(...);

Beh che dire, dopo questa "svista" sarà meglio che con il prossimo post possa recuperare credito nel forum , magari chiedendo(ti) consiglio (o aiuto) su un algoritmo, quantomeno brillante.

Buona notte . (a mia giustificazione posso chiamare anche in causa l'ora? e la giornata in piscina?)
Y3PP4 è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2009, 00:07   #10
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Lascia stare, non servono giustificazioni... c'è chi (io per primo) ha fatto e fa cose ben peggiori.

ciao
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Aetherflux e Lockheed Martin insieme per...
SpaceX sta proseguendo i test della terz...
Axiom Space ha mostrato un nuovo video d...
Realme: la trasformazione in sub-brand d...
PlayStation 6 si farà attendere: ...
BWT Alpine chiude la prima tornata di pr...
Beyond Good & Evil 2 non è st...
Qualcomm: il CEO ha guadagnato quasi 30 ...
AMD: 'Non importa cosa dice Intel, i mig...
Non è solo colpa del mercato: il ...
3 smartphone ai prezzi più bassi ...
Pwn2Own Automotive 2026 da record: 76 ze...
Più watt, più bassi e subwoofer incluso:...
Xiaomi POCO F8 Pro, un top di gamma a 54...
Tassa di 2 euro sui piccoli pacchi: un a...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 04:01.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v