Visualizzazione dei risultati da 1 a 10 su 24

Discussione: [C] logica di fgets()

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    155
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Nah, sono abbastanza sicuro che sia come dico, è un pattern diffuso.
    Eppure non si faceva presente il caso di non terminazione dello stream. A me sembra che volesse dire se non si vuole che nella stringa venga inserita una andata a capo. Tu però cosa intendi esattamente con

    "gestisce solo il caso "banale" - ovvero, c'è stato tutto e lo stream non è terminato"?

    con "tutto" intendi fino a \n e però non si è messo lo zero? però nel primo msg avevi detto "se lo stream di input termina, non verrà "inventato" alcun newline".. non mi è chiara questa cosa



    Non capisco cosa non ti è chiaro...
    il fatto che dica "mettendolo alla fine della stringa" e poi affermi "ovvero una posizione
    prima della fine
    della stringa". (Mi sembra che non abbia senso dire che \n sta alla fine se subito dopo si ammette che \0 la rimpiazza una posizione prima della fine; al limite poteva avere senso dire che piazzando lo zero al posto di \n, la stringa finiva una posizione prima della precedente.)
    Ultima modifica di filips; 26-09-2016 a 14:43
    Per fare un tavolo ci vuole un fiore.

  2. #2
    Quote Originariamente inviata da filips Visualizza il messaggio
    Eppure non si faceva presente il caso di non terminazione dello stream.
    Appunto, è per quello che dico che è incompleta, funziona correttamente nel caso "banale" in cui lo stream non è terminato.
    A me sembra che volesse dire se non si vuole che nella stringa venga inserita una andata a capo.
    Appunto-bis, vuole rimuovere l'a-capo che viene letto dalla fgets; il punto che dico è che non tiene conto che ci sono alcuni casi in cui questo a-capo non viene messo, che lui non gestisce.
    Tu però cosa intendi esattamente con

    "gestisce solo il caso "banale" - ovvero, c'è stato tutto e lo stream non è terminato"?

    con "tutto" intendi fino a \n e però non si è messo lo zero? però nel primo msg avevi detto "se lo stream di input termina, non verrà "inventato" alcun newline".. non mi è chiara questa cosa
    None! Intendo dire che gli hai passato un buffer lungo a sufficienza per leggere tutta la riga, newline compreso (e NUL compreso, che viene sempre messo), e che lo stream non è terminato, ovvero l'utente non ha premuto Ctrl-D (o Ctrl-Z su Windows) o, se l'input è stato rediretto da file, il file non è terminato. Non viene gestito invece il caso di stream terminato (cosa che capita sempre se si sta leggendo da file o in generale lo standard input è stato rediretto).
    il fatto che dica "mettendolo alla fine della stringa" e poi affermi "ovvero una posizione
    prima della fine
    della stringa". (Mi sembra che non abbia senso dire che \n sta alla fine se subito dopo si ammette che \0 la rimpiazza una posizione prima della fine; al limite poteva avere senso dire che piazzando lo zero al posto di \n, la stringa finiva una posizione prima della precedente.)
    È solo una confusione di terminologia. La stringa finisce dove sta il NUL. Se non c'è un NUL, non è una stringa C e non ha senso parlare di fine della stringa (esistono le stringhe counted, ma è un altro paio di maniche). Se rimpiazzi un carattere che attualmente sta prima del NUL con un NUL, la stringa si accorcia, troncando via il carattere che hai sostituito e tutti quelli che lo seguivano.
    Amaro C++, il gusto pieno dell'undefined behavior.

Tag per questa discussione

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