2013-02-27 18 views
11

Uczę się C z książki K & R "The C Programming Language". Wykonuję ćwiczenia określone w książce. Jestem na ćwiczeniu numer 1.16, ale nie rozumiem tego.Ćwiczenie K & R 1.16 - Ograniczenie długości linii

Ćwiczenie 1.16:

przeglądu główna procedura programu najdłużej linii tak będzie poprawnie wydrukować długość dowolnie długich liniach wejściowych, jak i miarę możliwości tekstu.

Moje pytania:

  1. "... jak najwięcej tekstu ..." - jest tam pewne ograniczenia na długość łańcucha? Może w standardowych nagłówkach jest zmienna o maksymalnej dozwolonej wartości długości łańcucha?

  2. "... długość dowolnie długich linii wejściowych ..." - ale w kodzie MAXLINE jest zdefiniowana jako 1000. Jest również ograniczony. Widzę rozwiązania here, ale moim zdaniem nie jest to decyzja rozwiązania, ponieważ na pierwszym jest ograniczenie długości linii (1000 znaków).

Może nie rozumiem tego zadania. Rozumiem, że muszę usunąć limit 1000 znaków.

+1

Nie mam teraz mojego K & R ze mną, więc nie mogę naprawdę sprawdzić wymagań najdłuższego programu. Pamiętaj jednak, że możesz czytać, drukować i liczyć pojedyncze znaki bez potrzeby zapisywania ich w ciągu znaków. – pmg

+0

@pmg Ale zgodnie z tekstem zadania, muszę i wydrukować tekst na końcu linii. –

+0

Cóż ... jeśli musisz wydrukować najdłuższą linię, musisz ją gdzieś zapisać. Moja sugestia nie jest dobra do ćwiczenia, przepraszam. – pmg

Odpowiedz

12

Jest to dość wcześnie ćwiczenie K & R, jesteś po prostu robić kilka drobnych zmian w kodzie, a nie całkowite przeprojektowanie kodu.

  1. "... jak najwięcej tekstu ..."

    jest do was do interpretacji. Zrobiłbym to, drukując to, co jest przechowywane w buforze longest. tj. wydrukować do 1000 znaków linii. Ponownie, jest to wczesne ćwiczenie, z niewielkim wprowadzeniem do dynamicznie przydzielonej pamięci. I w tym czasie napisano K & R, przechowywanie dowolnie długich linii tekstowych nie było tak realistyczne, jak jest dzisiaj.

  2. "... długość dowolnie długich liniach wejściowych ..."

    jest twardym wymogiem. Musisz znaleźć właściwą długość, bez względu na to, jak długo to trwa (przynajmniej w granicach int.)

Jednym ze sposobów rozwiązania tego problemu jest:

  • Po wywołaniu getline(), należy sprawdzić, czy ostatni znak czytać w buforze line jest znak nowej linii ('\ n')
  • Jeśli tak, to czytasz kompletną linię. Zmienna len jest prawidłowa długość linii (wartość zwracana getline(), a gdy nie jest potrzebny szczególną uwagę w porównaniu do oryginalnego kodu.
  • Jeśli jest nie, że nie przeczytać całą linię, a musisz polować na koniec tej linii, Dodajesz pętlę while, wywołując getchar(), dopóki nie zwróci nowej linii (lub EOF), i policzy liczbę znaków, które odczytałeś w tej pętli, po prostu zrób len++, aby to zliczyć
  • Po wykonaniu pętli while nowa len jest teraz faktyczną długością linii, ale nasz bufor ma tylko pierwsze 999 znaków.
  • Tak jak poprzednio, przechowujesz (wywołanie funkcji copy) obecny line bufor (max 1000 znaków), jeśli ta linia jest jak dotąd najdłuższa.
  • Gdy skończysz, wydrukujesz zapisaną linię jak poprzednio (bufor longest) i zmienną max dla długości.
    • Z powodu wyżej wspomnianej pętli while, długość max jest teraz poprawna.
    • Jeśli linia longest rzeczywiście była dłuższa niż 1000 znaków. przynajmniej wypisujesz pierwsze 999 znaków - co jest "jak najwięcej".

nie będę psuć go i pisać kod potrzebny do osiągnięcia tego celu, ale to tylko 6 linii kodu, które trzeba dodać do programu najdłużej linii ćwiczeń 1-16.

+0

Dzięki. Spróbuję przetłumaczyć to na rosyjski i napisać kod jutro. Teraz jest noc i chcę spać. Dziękuje za wszystko! –

1
  1. na nowoczesnych maszynach „jak najwięcej tekstu” będzie prawdopodobnie cały tekst, dzięki automatycznie line-owijania programy terminalowe. Ta książka została napisana, gdy terminale dalekopisowe były nadal w użyciu. Nie ma ograniczeń dotyczących długości napisów innych niż ograniczenia pamięciowe maszyny, nad którą pracujesz.

  2. Oni spodziewa się, aby dodać jakieś pętli odczytać znaki i szukać nowej linii zamiast przy założeniu, że do odczytu wielkości bufora MAXLINE będzie zawierać przełamane na pewno.

+0

Pamiętam, że przeczytałem gdzieś, że '4096' limit znaków na linię w pliku tekstowym w systemie Linux. Teraz jest obsługiwany dalej? od kiedy? – SparKot

+0

'automatycznie zaciągające się zaciski" - co to jest? –

+1

@DoSparKot, spróbuj - na pewno zobaczysz, że nie ma takiego limitu. Nigdy o czymś takim nie słyszałem. –

Powiązane problemy