2013-02-27 11 views
11

Sto imparando C da K & R "The C Programming Language" libro. Sto facendo gli esercizi specificati nel libro. Sono nell'esercizio numero 1.16, ma non lo capisco.Esercizio K & R 1.16 - Limitazione lunghezza linea

Esercizio 1.16:

rivedere la routine principale del programma più lunga linea quindi sarà correttamente stampare la lunghezza delle linee di ingresso arbitrariamente lunghe, e come più possibile del testo.

Le mie domande:

  1. "... quanto più possibile del testo ..." - c'è qualche limitazione lunghezza della stringa? Forse nelle intestazioni standard c'è una variabile con il valore massimo consentito della lunghezza della stringa?

  2. "... la lunghezza di righe di input arbitrariamente lunghe ..." - ma nel codice MAXLINE è definito come 1000. È anche una dimensione limitata. Vedo alcune soluzioni here, ma a mio parere non è una decisione di soluzione, dal momento che sul primo c'è una restrizione sulla lunghezza di una riga (1000 caratteri).

Forse non ho capito il compito. La mia comprensione è che devo rimuovere la limitazione di 1000 caratteri.

+1

Non ho il mio K & R con me ora, quindi non posso davvero controllare i requisiti del programma a più lunga distanza. Ricorda, però, puoi leggere, stampare e contare singoli caratteri senza doverli salvare in una stringa. – pmg

+0

@ pmg Ma secondo il testo dell'attività, devo anche stampare il testo della linea massima. –

+0

Beh ... se devi stampare la riga più lunga, devi salvarla da qualche parte. Il mio suggerimento non va bene per l'esercizio, mi dispiace. – pmg

risposta

12

E 'un esercizio piuttosto presto K & R, sei solo suppone di fare alcune piccole modifiche al codice, non è una riprogettazione totale del codice.

  1. "... quanto più possibile del testo ..."

    sta a voi da interpretare. Lo farei stampando ciò che è memorizzato nel buffer longest. ad esempio stampa fino a 1000 caratteri della linea. Ancora una volta, è un esercizio iniziale, con una piccola introduzione alla memoria allocata dinamicamente. E al momento in cui K & R è stato scritto, la memorizzazione di righe di testo arbitrariamente lunghe non era possibile come oggi.

  2. "... la lunghezza delle linee di ingresso arbitrariamente lunghe ..."

    è un requisito difficile. Dovresti trovare la lunghezza corretta indipendentemente dalla durata (almeno entro i limiti di uno int.)

Un modo per risolvere questo problema è:

  • Dopo la chiamata a getline(), controllare se l'ultimo carattere letto nel buffer line è un ritorno a capo ('\ n')
  • Se lo è, leggi una riga completa. La variabile len corrisponde alla lunghezza corretta della riga (il valore restituito da getline() e non è necessaria alcuna considerazione rispetto al codice originale.
  • Se è non, non hai letto l'intera riga e devi cercare la fine di questa linea: aggiungi un ciclo while, chiamando getchar() fino a che non restituisce una nuova riga (o EOF) e conta il numero di caratteri che leggi in quel ciclo, ma solo
  • .
  • Al termine del ciclo while, il nuovo len ora è la lunghezza effettiva della linea, ma il nostro buffer ne ha solo i primi 999.
  • Come prima, si memorizza (la chiamata di funzione copy()) attualeBuffer(max 1000 caratteri) se questa riga è la più lunga finora.
  • Al termine, stampare la riga memorizzata come prima (il buffer longest) e la variabile max per la lunghezza.
    • A causa del ciclo sopra menzionato, la lunghezza di max ora è corretta.
    • Se la riga longest era effettivamente più lunga di 1000 caratteri. perlomeno stampi quei primi 999 caratteri, che è "il più possibile".

io non ti rovinare esso e inserisci il codice necessario per raggiungere questo obiettivo, ma è solo 6 righe di codice che è necessario aggiungere al programma più lunga linea di esercizio 1-16.

+0

Grazie. Proverò a tradurlo in russo e a scrivere il codice domani. Ora è notte, e voglio dormire. Grazie a tutti! –

1
  1. Sulle macchine moderne "quanto più possibile del testo" è probabile che sia tutto il testo, grazie alla automaticamente line-wrapping programmi di terminale. Quel libro è stato scritto quando i terminali di teletype erano ancora in uso. Non ci sono limitazioni sulla lunghezza delle stringhe se non su limiti di memoria della macchina su cui stai lavorando.

  2. Si aspetta che tu aggiunga qualche tipo di loop per leggere i caratteri e cercare le nuove righe piuttosto che presumere che una lettura nel buffer di dimensioni MAXLINE contenga sicuramente una nuova riga.

+0

Ricordo di aver letto da qualche parte che il limite di caratteri '4096' per riga nel file di testo su Linux. È supportato oltre a questo ora? da quando? – SparKot

+0

'programmi di terminale di avvolgimento automatico della linea' - che cos'è? –

+1

@DoSparKot, provalo - sono sicuro che vedrai che non esiste un limite di questo tipo. Non ho mai sentito parlare di una cosa del genere. –