Toon posts:

[cpp] geheugen legen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Als ik twee waardes vraag die ingevoerd moeten worden dan kan ik doen:

stel vraag 1:
lees vraag1

stel vraag 2:
lees vraag2

Het nadeel is nu dat als ik bij vraag 1 invul: "1 2" Dan ziet C dit als twee antwoorden dus vult hij automatisch bij de tweede vraag in wat achter de spatie staat.
Maar kan ik ook tussen het lezen van vraag 1, en het schrijven van vraag 2 mijn geheugen/buffer zien te legen zodat hij die " 2"kwijt is.
??????

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

code??

Doet iets met Cloud (MS/IBM)


  • Frostie
  • Registratie: September 2000
  • Laatst online: 22-07 16:02
Op dinsdag 19 maart 2002 09:35 schreef rodekaart het volgende:

Het nadeel is nu dat als ik bij vraag 1 invul: "1 2" Dan ziet C dit als twee antwoorden dus vult hij automatisch bij de tweede vraag in wat achter de spatie staat.
Maar kan ik ook tussen het lezen van vraag 1, en het schrijven van vraag 2 mijn geheugen/buffer zien te legen zodat hij die " 2"kwijt is.
??????
Anders zorg je dat je je invoer laat afsluiten met een \n. Je leest dan tot de enter en dat is dan variabele 1. Weet niet of je dit bedoelt want vraagstelling is super vaag.

Weaseling out of things is important to learn. It's what separates us from the animals... except the weasel. Homer Simpson


  • Sjonny
  • Registratie: Maart 2001
  • Laatst online: 10:02

Sjonny

Fratser

fflush(stdin);

of

cin.flush(); // geloof ik.

The problem is in the part of your brain that handles intelligence.


Verwijderd

Topicstarter
Op dinsdag 19 maart 2002 10:02 schreef Sjonny het volgende:
fflush(stdin);

of

cin.flush(); // geloof ik.
[C++ Error] Pro2.cpp(149): E2316 'flush' is not a member of 'istream'

Verwijderd

C-achtige code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
  char buffer[256];
  int waarde1, waarde2;

  printf("Voer waarde 1 in en druk op [enter]:\n");
  fgets(buffer, sizeof(buffer), stdin);
  waarde1 = atoi(buffer);
  printf("Voer waarde 2 in en druk op [enter]:\n");
  fgets(buffer, sizeof(buffer), stdin);
  waarde2 = atoi(buffer);

  printf("Ingevoerde waardes: waarde1 = %d en waarde2 = %d\n",
    waarde1, waarde2);

  return 0;
}

Sim-pel :)

  • PromWarMachine
  • Registratie: Oktober 2001
  • Laatst online: 04-09 21:51

PromWarMachine

Forsaken Archer

Als de invoerwaarden tussen de 0 en de 99 liggen, kun je afvangen dat hij maximaal 2 characters inleest, dit kan het met commando setprecision(x) waarbij x staat voor het aantal karakters dat hij leest. Je kan onbeperkt tekens invoeren, hij leest er echter maar een paar in.

Voor de exacte syntax verwijs ik je naar de help file van Borland®.

Als ik zo nog tijd heb (zit in de pauze op school) kopieer ik het ff voor je ;)

/edit
Hrmm, het is een onderdeel van een library en aangezien die niet per stuk in die help vermeldt worden, kan ik je niet verder helpen :'(. Kep m'n boek ook vandaag niet bij me, wel Unix, maar daar heb je dan weer nix aan :P

Dividend for Starters


Verwijderd

code:
1
getline(cin, string);

leest in tot een [enter].

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op dinsdag 19 maart 2002 10:58 schreef Sneechy het volgende:
code:
1
getline(cin, string);

leest in tot een [enter].
...en is NIET conform de standaard EN (nog erger) NIET veilig (in verband met de beperkte grote van je buffer). Niet gebruiken dus. Een veilig alternatief is "fgets(stdin,sizeof(string),string)", waarna je vervolgens met sscanf de gewenste informatie uit de string kan lezen. Zorg wel dat je string 'lekker' groot is anders kun je alsnog niet de hele regel uitlezen.

Een wat algemenere (en daardoor mooiere, hoewel minder efficiente) methode is het gebruik van fgetc (of getchar in het geval van standaard invoer) om naar het einde van de regel te gaan:
code:
1
2
3
4
printf("Geef een getal:\n");
scanf("%i",&getal1); while ((getchar()!='\n')&&(!feof(stdin));
printf("en nog een:\n");
scanf("%i",&getal2); while ((getchar()!='\n')&&(!feof(stdin));

Die check op eof is een beetje ranzig maar helaas wel noodzakelijk. Natuurlijk kun je net zo goed afbreken bij een feof ("while(getchar()!='\n') if(feof(stdin)) return;" ofzo) want dan faalt je volgende scanf toch.

Verwijderd

Op dinsdag 19 maart 2002 11:19 schreef Soultaker het volgende:

[..]

...en is NIET conform de standaard.
Wel (hij staat iig in de December '96 draft). Stroustrop gebruikt 'em in TC++PL.
EN (nog erger) NIET veilig (in verband met de beperkte grote van je buffer).
In diezelfde draft kun je vinden dat ie wel veilig is.
Een wat algemenere (en daardoor mooiere, hoewel minder efficiente) methode is het gebruik van fgetc (of getchar in het geval van standaard invoer) om naar het einde van de regel te gaan:
code:
1
...
Jakkiebah !!! Noem je dat mooi ? Dan vind ik std::getline toch een stuk beter :).

Leer een keer C++, dan hoef je niet terug te vallen op dit soort C lelijkheden.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op dinsdag 19 maart 2002 11:26 schreef Sneechy (over getline) het volgende:
Wel (hij staat iig in de December '96 draft). Stroustrop gebruikt 'em in TC++PL.
In diezelfde draft kun je vinden dat ie wel veilig is.
Oh, 't was C++. Sorry, ik dacht dat 't weer zo'n ranzige remnant C functie was.
Jakkiebah !!! Noem je dat mooi ? Dan vind ik std::getline toch een stuk beter :).
Intern gebruikt getline dezelfde OS API calls, dus getline zal wel vreselijk inefficient geimplementeert zijn OF ook gebruik maken van een buffertje (en ik gok het laatste). Zelf kun je natuurlijk ook wel een functie bouwen die ongeveer hetzelfde doet maar dan een char* oplevert. Ik ben echter met je eens dat de OO oplossing in dit geval mooier is. C is nou eenmaal ontworpen voor het lezen/schrijven van binaire bestanden. Verder wil ik wel aanmerken dat getline onnodig veel geheugen alloceert als de gebruiker oneindig grote invoer geeft terwijl de C functies alleen die karakters lezen die je nodig hebt en de rest weggooien.
Leer een keer C++, dan hoef je niet terug te vallen op dit soort C lelijkheden.
In het algemeen is C prima geschikt voor algoritmes en dergelijke en dan is het vrij lelijk om alleen C++ te gebruiken voor de I/O.

Verwijderd

Op dinsdag 19 maart 2002 11:36 schreef Soultaker het volgende:
Intern gebruikt getline dezelfde OS API calls, dus getline zal wel vreselijk inefficient geimplementeert zijn OF ook gebruik maken van een buffertje (en ik gok het laatste).
De implementatie van std::getline is niet gestandaardizeerd. Verder is het naief om aan te nemen dat een standard library functie 'vreselijk inefficiënt' geimplementeerd zal zijn. En tot slot: std::cin is een gebufferde std::istream, en daar is echt niks mis mee :).

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:38
Op dinsdag 19 maart 2002 11:36 schreef Soultaker het volgende:

Intern gebruikt getline dezelfde OS API calls, dus getline zal wel vreselijk inefficient geimplementeert zijn OF ook gebruik maken van een buffertje (en ik gok het laatste).
OF getline pikt gewoon de buffer af waar het OS de karakters in had staan en geeft die aan string, OF getline vraagt eerst aan het OS hoeveel karakters die heeft en resize'd de string tot precies dezelfde grootte, OF...
(ik gok op het laatste)
Verder wil ik wel aanmerken dat getline onnodig veel geheugen alloceert als de gebruiker oneindig grote invoer geeft terwijl de C functies alleen die karakters lezen die je nodig hebt en de rest weggooien.
[..]
Welnee; getline() heeft een optioneel argument dat aangeeft hoeveel karakters je maximaal wil; de rest ignore() je gewoon. En wanneer heb jij voor het laatst een regel van meer dan 1Mb zonder newlines getikt? Boeiuh dus.
In het algemeen is C prima geschikt voor algoritmes en dergelijke en dan is het vrij lelijk om alleen C++ te gebruiken voor de I/O.
Jaja. Algoritmes in C zijn soms echt langzaam - qsort is typisch facoren langzamer dan std::sort (doubles, x86, 680% volgens Scott Meyers). En als je in <algorithm> kijkt zie je een redelijke collectie algorithmes waar je in C tonnen onleesbare code voor moet schrijven.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 11-09 18:14
Op dinsdag 19 maart 2002 12:02 schreef MSalters het volgende:
Jaja. Algoritmes in C zijn soms echt langzaam - qsort is typisch facoren langzamer dan std::sort (doubles, x86, 680% volgens Scott Meyers). En als je in <algorithm> kijkt zie je een redelijke collectie algorithmes waar je in C tonnen onleesbare code voor moet schrijven.
Helaas geloof ik niet dat het dan om hetzelfde algoritme gaat.

Wel jammer dat er geen standaard comparison functions gedefinieerd zijn voor het vergelijken van verschillende types, zoals in de STL van C++ wel gedaan is.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Gaat wel om hetzelfde algoritme, maar komt door inline functies denk ik.

  • igmar
  • Registratie: April 2000
  • Laatst online: 09-09 19:53

igmar

ISO20022

Wel (hij staat iig in de December '96 draft). Stroustrop gebruikt 'em in TC++PL.
Geen standaard ANSI functie.
In diezelfde draft kun je vinden dat ie wel veilig is.
Niet veilig, je kan de lengte van de buffer niet opgeven.

Verwijderd

Op dinsdag 19 maart 2002 16:23 schreef igmar het volgende:

[..]

Geen standaard ANSI functie.
[..]

Niet veilig, je kan de lengte van de buffer niet opgeven.
Lees de thread ff, we hebben het hier over de C++ std::getline :Z.

Verder wordt het hier als normaal gezien dat je vermeldt wie je citeert.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 11-09 18:38
Op dinsdag 19 maart 2002 13:18 schreef OlafvdSpek het volgende:
Gaat wel om hetzelfde algoritme, maar komt door inline functies denk ik.
Meestal is het (vrijwel) hetzelfde algoritme; een verschil is inderdaad in dat de sort geinlined kan worden voorin de compiler. En bovendien kan door het inlinen de assembly optimizer ook z'n werk beter doen: een compare kun je makkelijker schedulen dan een functie call.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1