in C Meerdere regels inlezen

Status
Niet open voor verdere reacties.

Chargeotto

Gebruiker
Lid geworden
22 aug 2007
Berichten
147
Op dit moment volg ik een aantal lessen over C, en 1 van de vragen van het huiswerk is:

"Schrijf een programma dat meerdere regels tekst van het toetsenbord leest en daarna de langste
gelezen regel afdrukt. Ga er vanuit dat het laatste teken een punt (.) is. Gebruik ook weer gets en puts "

Ik vraag niet om een antwoord of iets, maar hoe kan ik meerdere regels tekst inlezen in de commandline met gets?
Naar mijn idee kan je maar 1 regels daarmee inlezen.
 
Het is toch geen probleem om meerdere regels in te lezen als je stelt dat een regel wordt afgesloten door een punt? De functie gets stopt immers pas bij een newline/EOF en niet bij een punt. Het is vervolgens aan jou om die data te filteren om het gewenste resultaat te krijgen.
 
Het is toch geen probleem om meerdere regels in te lezen als je stelt dat een regel wordt afgesloten door een punt? De functie gets stopt immers pas bij een newline/EOF en niet bij een punt. Het is vervolgens aan jou om die data te filteren om het gewenste resultaat te krijgen.

Enige wat ik me afvraag dan is, de regel sluit dan toch meteen af op het moment dat je na de 1e regel op enter drukt?
 
Met gets lees je inderdaad tot aan een newline (of een end-of-file).

Meerdere regels lezen kan dus enkel door meerdere keren 1 regel in te lezen. En om iets meerdere keren uit te voeren, gebruik je best een lus.

Een do-while lus lijkt me hier aangewezen; structuurvoorbeeld:
Code:
do
{
    gets van een regel;
    if (regel langer dan langste)
    {
        langste = regel;
    }
} while (laatste teken is geen punt);
 
Enige wat ik me afvraag dan is, de regel sluit dan toch meteen af op het moment dat je na de 1e regel op enter drukt?

Ja, indien je op enter drukt wel ja. Maar als je er vanuit kunt gaan dat het einde van een regel wordt afgesloten met een punt, kun je meerdere regels doorgeven via één aanroep naar gets, omdat elke punt een regel betekent.

(en dan zou je bijvoorbeeld met strtok kunnen werken om de regels te filteren)

Zoals Johantrax het beschrijft kan het ook, alleen vraag ik me dan af waarom er expliciet wordt aangegeven wat het einde van een regel is?
 
Er staat niet dat het einde van een regel een punt is, maar dat het laatste teken dat je moet inlezen een punt is..
 
Er staat niet dat het einde van een regel een punt is, maar dat het laatste teken dat je moet inlezen een punt is..

Ik geloof inderdaad dat ik daar zelf de mist in ben gegaan, gelukkig zijn er nog anderen die meedenken :p
 
Dacht dat het niet heel moeilijk was..... maar zit nu toch al tijdje met het probleem dat hij er niet echt veel zin in heeft :confused:

Ik dacht eerst dat //langste = str; wel zou werken, maar dat bleek niet het geval te zijn, dus daarna handmatig het array gekopierd.

Maar ben ook bang dat sizeOf misschien simpelweg 5000 teruggeeft?

Hieronder is de code die ik nu heb....

Code:
char langste[5000];  
char str[5000];
  
puts("Typ meerdere regels in... Sluit af met een punt.... De langste regel zal afgedrukt worden.");
  
  do
  {
    gets(str);
    if (sizeof(str) > sizeof(langste))
    {
        //langste = str;
        int i;
        for(i=0; i<sizeof(str); i++)
        {
            langste[i] = str[i];
        }    
    }
  } 
  while(str[sizeof(str)]!='.');
 
Je moet strlen(str) gebruiken in plaats van sizeof(str). Verder begint de index vanaf 0 en loopt deze tot de lengte van de string - 1. char *s = "Hallo" wordt dan dus s[0] = 'H', s[1] = 'a', ... , s[4] = 'o'. -> str[strlen(str)]!='.') -> wordt dan dus str[strlen(str)-1] != '.'

[cpp]
char b[4096], s[4096] = {0};
do {
gets(b);
if (strlen(b) > strlen(s)) strcpy(s, b);
} while (b[strlen(b)-1] != '.');
printf("%s\n", s);
[/cpp]

edit: code moeten aanpassen (iets teveel C++ :P):

Het is dat je gets moet gebruiken, maar anders zou je de invoer beter zelf kunnen afhandelen (en op die manier meerdere regels achter elkaar kunnen inlezen):

[cpp]
int c;
char s[4096] = {0};
do {
char b[4096], *p = &b[0];
while ((c = getc(stdin)) && c != '.' && c != '\n') *p++ = c;
*p = '\0';
if (strlen(b) > strlen(s)) strcpy(s, b);
} while (c != '.');
printf("%s\n", s);
[/cpp]

Al doen beide stukken code niet exact hetzelfde. Bij het laatste stuk is een punt het teken dat aangeeft dat er gestopt moet worden, en zal er geen verdere invoer meer gelezen worden. Terwijl bij het eerste stuk er wel meerdere punten mogelijk zijn, als ze maar niet op het einde van een regel staan.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan