Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
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 ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
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


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...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Il MacBook Pro è sempre più...
Il prezzo della Switch 2 potrebbe divent...
TikTok chiarisce il funzionamento della ...
Samsung Galaxy A07 5G: il nuovo entry le...
Realme 16 in arrivo: un mix tra iPhone A...
Domenica di follia su Amazon: iPhone 17 ...
Questo portatile HP OMEN con Core Ultra ...
Robot aspirapolvere al prezzo giusto: le...
Il nuovo M5 Max potrebbe avere una GPU p...
Pulizie automatiche al top (e a prezzo B...
Casa più calda, spese più leggere: Tado ...
Mini PC mostruoso in offerta nascosta su...
Netflix promette 45 giorni di esclusivit...
Gigabyte: un handheld? Sì, ma sol...
Samsung conferma l'arrivo di tre variant...
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: 20:51.


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