[C++] string met maximale grootte opvragen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
hallo allemaal,

ik zit met een probleempje wat heel simpel lijkt maar wat ik maar niet opgelost krijg. Ik wil dat mijn programma aan de gebruiken een string vraagt en dat het programma controleert hoe groot die is. Dus als de user meer chars invoert dan de bedoeling is moet mijn programma een bericht hierover geven. Ik heb hiervoor de volgende functie geschreven:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void get_string(char string[],int max_size,char name_item[]){
    int i;
    while(1){
        printf("Please enter %s with max %i chars: ",name_item,max_size);
        for(i=0;i<max_size;i++){
        string[i] = getchar();
            if(string[i] == '\n'){
                string[i] = '\0';
                return;
            }
        }
        printf("%s is too long! Please use a string of max %i chars\nPlease Try again\nPlease enter %s: ",name_item,max_size,name_item);
    }
}

Het probleem is echter dat ik als output krijg dat eerste call (ik doe er 2 achter elkaar) meteen skipt. hij denkt dat ik op enter druk zonder iets in tegeven. Ik denk dat dit komt omdat er een menutje voor zit waarbij je op enter moet drukken en hij de enter als het ware 'meeneemt' dat hij dus te snel is voor de user als het ware. weet iemand hoe ik dit moet oplossen? Heb het volgende al geprobeerd:
- clear van input
- cin.ignore()
- wachten totdat enter wordt losgelaten
helaas werkt dit allemaal niet, heeft iemand ideeën?

Acties:
  • 0 Henk 'm!

  • LiquidT_NL
  • Registratie: September 2003
  • Laatst online: 13-05-2021
Ik ben geen programmeer god (ik herken de taal niet eens, c++?), maar kan je niet gewoon de lengte opvragen van de string? string.size voor C++

[ Voor 6% gewijzigd door LiquidT_NL op 31-10-2012 13:45 ]

Explorers in the further regions of experience...demons to some, angels to others.


Acties:
  • 0 Henk 'm!

  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Het maakt nogal uit welke taal dit is... Gezien printf denk ik C?

Ik snap wat je wil doen, maar je moet ook goed doorlopen wat je code doet.
Wat hij nu doet is zeggen dat je tekens in moet voeren en dat het niet meer dan zoveel tekens mag zijn. Vervolgens lees je altijd zoveel tekens in (for o t/m max_size) en check je of het ingevoerde teken een enter is. Hij zal dus nooit dingen langer dan de max_size lezen

Wat je denk ik wil doen is:

C:
1
2
3
4
5
6
7
do{
        string[i] = getchar();
        i++;
}while( string[i] != '\n' )
if(i>max_size){
           //te lang, laat ze het opnieuw invoeren.
}


Dit zal tekens blijven lezen tot er op enter wordt gedrukt en als de counter hoger is dan het maximum een bericht geven van: doe eens opnieuw doen.

[ Voor 9% gewijzigd door Gropah op 31-10-2012 13:53 ]


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

@Gropah
En wat als string[] te klein is?
Daarnaast zal je while-check niet werken omdat i al 1 is opgehoogd ;)

Ik snap niet helemaal wat de TS bedoelt met 'menuutje'. Kun je wat duidelijk uitleggen? Daarnaast: probeer te debuggen: oftewel, lees je als eerste karakter wel een '\n' ? Zo ja? waarom zit die daar?
Als het komt omdat de user ervoor al een enter heeft ingedrukt, kun je die bijvoorbeeld met een readchar al negeren.

Kijk trouwens eens naar de 'cin' functie van C++. Veel makkelijker.

Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
uhm ja wat stom van me, dit is idd c++. had ik er ff bij moeten zetten. wat het menutje betreft dit ziet er zo uit:
C:
1
2
3
4
5
6
7
8
    printf("\t[R]ead accounts from file\n");
        printf("\t[S]ave accounts to file\n");
        printf("\t[Q]uit program\n");
        printf("Your choice: ");
        scanf(" %c",&choice);
                switch(tolower(choice)){
                //alle cases
                }


en ik wil idd doen wat gropah zegt, het is dus een soort beveiliging dat de string niet de maximale grote overschrijdt. het probleem is alleen dat ik het volgende als output krijg:
Please enter new username with max 64 chars:

Please enter password with max 64 chars:
//hier cursor
en dat is dus zonder dat ik nog een keer op enter heb gedrukt. dus alleen de enter van het menutje.

EDIT: ff de codetag op c highlighting gezet, hopelijk is het zo duidelijker

[ Voor 4% gewijzigd door williewonka03 op 31-10-2012 14:17 ]


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

*** Over topictitels in PRG - lezen voor topic openen!!! ***

Denk [C] in unix/linux omgeving?

Voor het enter probleem, lees je ook dat menu uit met getchar? dus je leest 1 karakter uit, maar niet de enter. Dan kom je dus in de problemen. Want unix geeft zijn inputbuffer pas vrij als je op enter drukt. (hoe buffering werkt...). Dus in het menu moet je op enter drukken, en vervolgens lees je alleen de keuze uit, niet de enter.

daarom zou ik ook inlenzen (pseudo code)
code:
1
2
3
4
5
6
7
8
9
newc=getchar()
while(!eof && newc != '\n')
  {
   if i < maxlength {
       returnstring[i]=newc;
       i++
   }
   }
returnstring[i]='\0'

Dus:
Altijd buffer leeglezen, inclusief enter.

PS.. is de maximale lenge inclusief de afsluitende 0 char, of exclusief...

[ Voor 7% gewijzigd door leuk_he op 31-10-2012 14:19 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
leuk_he schreef op woensdag 31 oktober 2012 @ 14:16:
*** Over topictitels in PRG - lezen voor topic openen!!! ***

Denk [C] in unix/linux omgeving?

Voor het enter probleem, lees je ook dat menu uit met getchar? dus je leest 1 karakter uit, maar niet de enter. Dan kom je dus in de problemen. Want unix geeft zijn inputbuffer pas vrij als je op enter drukt. (hoe buffering werkt...). Dus in het menu moet je op enter drukken, en vervolgens lees je alleen de keuze uit, niet de enter.

daarom zou ik ook inlenzen (pseudo code)
code:
1
2
3
4
5
6
7
newc=getchar()
while(!eof && newc != '\n')
  {
   if i < maxlength {
       returnstring[i]=newc;
       i++
   }

Dus:
Altijd buffer leeglezen, inclusief enter.
nee het is op windows en dat trucje van clearen heb ik al geprobeerd. ik haal de keuze voor menu op met scanf btw.

ow en ik zal ff naar cin functie kijken. en als reactie op de eerste reactie na ts: nee dat kan niet want de string moet nog ingevoerd worden.

[ Voor 7% gewijzigd door williewonka03 op 31-10-2012 14:19 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14-07 21:33

NMe

Quia Ego Sic Dico.

Waarom gebruik je scanf en printf in C++? Daar heb je toch cin en cout voor? Zoals EddoH in "string met maximale grote opvragen" al eerder opmerkte trouwens (al is cin geen functie maar een language construct :)).

Dan krijg je meteen ook een string (std::string) terug in plaats van een char pointer, en een string heeft een length method.

[ Voor 65% gewijzigd door NMe op 31-10-2012 14:22 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
NMe schreef op woensdag 31 oktober 2012 @ 14:19:
Waarom gebruik je scanf en printf in C++? Daar heb je toch cin en cout voor?
uhm ja ik ben c gewend dus daarom gebruik ik altijd scanf en printf. is cin zoveel beter dan?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14-07 21:33

NMe

Quia Ego Sic Dico.

Zie mijn edit. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
de max lengte is inclusief het sluitingsteken. ik ben nu naar cin functies aan het kijken. ff leren hoe dat moet

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

enne, windows:

MSDN: scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l (CRT)

cscanf_s moet je ook de lente van de string buffer opgeven. Precies was je zelf probeert na te maken.

[ Voor 3% gewijzigd door leuk_he op 31-10-2012 14:24 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
ok ik heb dus 2 opties: ik kan cin gebruiken met standard input en dan de lengte opvragen en memory ervoor aanmaken en dan wegschrijven, of ik kan scanf_s gebruiken. die laatste lijkt me het handigst. ik snap alleen nog niet wat scanf_s doet als je de limiet overschrijft?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14-07 21:33

NMe

Quia Ego Sic Dico.

Het punt van cin gebruiken is dat je die memory management helemaal niet in detail hoeft te doen. Een std::string heeft geen lengte die je vooraf opgeeft.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
ok dus ik heb nu dit:
C:
1
2
3
4
5
6
7
    get_string(new_account->username,64,"new username");
    printf("%s\n",new_account->username);

    while((ch=getchar()) != NULL && ch != '\n')//clearen van input stream

    get_string(new_account->password,64,"password");
    printf("%s\n",new_account->password);


en dit:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void get_string(char string[],int max_size,char name_item[]){
    int i;
    char ch;

    printf("Please enter %s with max %i chars: ",name_item,max_size);
    while(1){
        if(!(scanf_s(" %s",string,64))){
            printf("%s is too long! Please use a string of max %i chars\nPlease Try again\nPlease enter %s: ",name_item,max_size,name_item);
            while((ch=getchar()) != NULL && ch != '\n')//clearen van input stream
        }else{
            return;
        }
    }
}


en nu doet ie de username goed, maar slaat ie de password vraag over hij gaat nu meteen terug naar het menu. hoe kan dat nou, want ik heb de input stream toch gecleared?

EDIT: nou ik heb het eindeloos gedebugged maar ik snap hier echt niets van. hij springt gewoon over de get_string call van de password heen! ik heb met f10 lijn voor lijn gaan draaien en als hij bij de password call is dan springt het gele pijltje gewoon over de call heen. ik snap hier echt niets van, nog nooit gehad dit. ook een breakpoint in de get_string functie wordt nooit bereikt

[ Voor 17% gewijzigd door williewonka03 op 31-10-2012 14:54 ]


Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

hint : "mssing ;" in while
Hint2 doe ook eens zonder clearen buffer.) commetaar die uit

[ Voor 25% gewijzigd door leuk_he op 31-10-2012 14:55 . Reden: edit als reactie op edit ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
leuk_he schreef op woensdag 31 oktober 2012 @ 14:55:
hint : "mssing ;" in while
Hint2 doe ook eens zonder clearen buffer.) commetaar die uit
hint1: geen flauw idee wat je bedoelt :P
hint2: ik zou toch zweren dat ik dat net ook gedaan had, maar nou doet ie het opeens, vaag zeg. maar bedankt!

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

weet je zeker dat je 2e vraag wel gesteld word (zet een breakpoint)?
zo ja, wat denkt het programma dat het antwoord op de vraag is?

en het testen van getchar() op NULL, waarom doe je dat? praktischer is het om te testen op EOF oid.

doe eens gewoon een step-by-step van je programma (F10 in visual studio op windows), en KIJK waar het fout gaat. debugging is echt niet zo moeilijk...

-niks-


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14-07 21:33

NMe

Quia Ego Sic Dico.

Maak het jezelf nou makkelijker en gebruik gewoon die iostreams van C++ in plaats van vast te houden aan de C-varianten daarop die veel minder flexibel zijn en meer moeite kosten.

C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>

string username = "";
while (username.length() <= 0 || username.length() > 64)
{
    cout << "Please enter username with max 64 chars: ";
    cin >> username;
    if (username.length() == 0 || username.length() > 64)
        cout << "username is too long! Please use a string of max 64 chars\nPlease Try again\n";
}

Ja, dat zou je even in een functie moeten gieten. Maar al dat geclear is dan niet meer nodig en zeg nou zelf, dit is toch veel leesbaarder? Strings zijn veel makkelijker dan char pointers, zeker als je blijkbaar niet zo veel ervaring in huis hebt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
MLM schreef op woensdag 31 oktober 2012 @ 14:57:
weet je zeker dat je 2e vraag wel gesteld word (zet een breakpoint)?
zo ja, wat denkt het programma dat het antwoord op de vraag is?

en het testen van getchar() op NULL, waarom doe je dat? praktischer is het om te testen op EOF oid.

doe eens gewoon een step-by-step van je programma (F10 in visual studio op windows), en KIJK waar het fout gaat. debugging is echt niet zo moeilijk...
nou de 2e vraag werd blijkbaar niet gesteld omdat ik de input te vroeg clearde. en de f10 heb ik gebruikt zie eerdere post. maar het werkt nu, zie eerdere post


@NMe: ja dat ga ik denk ik ook voor de volgende module doen. maar dit werkt nu dus dat laat ik maar ff zo

bedankt voor de hulpt allemaal! hier kan nu een slotje op denk ik

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

missende ; was je laatste probleem.

code:
1
2
while  (false)
     cout << "this wil never print);

ofwel

code:
1
2
3
 while (rommel rommel false )

cout << "this will never print"


terwijl
code:
1
2
while (false);
     cout << "druk dit altijd af";



Verder is mixen van cin/cout , scanf/printf
en
char * en String type, altijd verwarrend. Je gaat het een gebruiken of het ander.

[ Voor 25% gewijzigd door leuk_he op 31-10-2012 15:19 ]

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

NMe schreef op woensdag 31 oktober 2012 @ 14:19:
(al is cin geen functie maar een language construct :)).
cin is gewoon een object, geen taalconstructie.

En over die _s varianten van standaardfuncties, leuk enzo maar wel heel erg MS only. Een string van maximaal aantal tekens kun je ook doen door te doen: scanf("%32s"), waarbij die 32 dus voor het aantal tekens staat.

Maar idd, met std::string icm std::getline() heb je het hele probleem niet.

[ Voor 41% gewijzigd door .oisyn op 31-10-2012 19:18 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Nu online

remco_k

een cassettebandje was genoeg

En als je dan toch de lengte van een ingevoerde string wilt weten, dan is er toch gewoon de strlen() functie?

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 14-07 21:33

NMe

Quia Ego Sic Dico.

.oisyn schreef op woensdag 31 oktober 2012 @ 19:14:
[...]

cin is gewoon een object, geen taalconstructie.
C++ is alweer een tijdje terug. :+ Je hebt (natuurlijk :P) gelijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Overigens, F10 is step over, nogal wiedes dat ie dan de functie niet inspringt. Met F11 doe je step into.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-07 23:22
leuk_he schreef op woensdag 31 oktober 2012 @ 15:14:
Verder is mixen van cin/cout , scanf/printf
en
char * en String type, altijd verwarrend. Je gaat het een gebruiken of het ander.
printf rulez, always.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
.oisyn schreef op woensdag 31 oktober 2012 @ 20:04:
Overigens, F10 is step over, nogal wiedes dat ie dan de functie niet inspringt. Met F11 doe je step into.
he? ik doe altijd f10 en dat gaat ie ook gewoon functies in hoor. dan verspringt het pijltje naar de eerste statement van de betrefende functie.

Acties:
  • 0 Henk 'm!

  • jayvol09
  • Registratie: Augustus 2009
  • Laatst online: 02-09-2020
Informatica opdracht voor middelbare school? Lees H1+H2 van een willekeurig C++ boek :). Er zitten zoveel denkfouten dat het teveel tijd kost om ze allemaal op te noemen, terwijl dit eigenlijk basic flow control + string object methods is.
Maar zelf heb nooit met C moeten werken, dus misschien ligt het daar aan. Succes. Ik durf C++ - How to prgram 8th ed van Pearson aan te raden maar er zijn vast wel meer goeie.

"Between the weak and the strong one it is the freedom which oppresses and the law that liberates" [Jean Jacques Rousseau]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

williewonka03 schreef op woensdag 31 oktober 2012 @ 22:12:
[...]

he? ik doe altijd f10 en dat gaat ie ook gewoon functies in hoor. dan verspringt het pijltje naar de eerste statement van de betrefende functie.
In Visual Studio met standaard Visual C++ instellingen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

F10 wanneer je nog niet debugged, gaat naar eerste regel van main/WinMain. Vanaf daar kan je kiezen hoe je gaat met F10 (volgende regel)/F11 (volg functie aanroep). Maar tbh, breakpoint zetten in designmode (F9) op de code net voordat je programma niet meer doet wat je wilt, en dan F5 (build/run) is meestal praktischer, maar gezien de omvang van het programma (klein, alles in main functie), had ik F10 voorgesteld :)

Step-into kan vaak nogal wat irrelevante code doorploegen in C++ (zoals (copy)-constructors/destructors van temporaries, overloaded operators, conversion operators, smart-pointer dereference etc), dat is waarom ik toch meer F10 dan F11 gebruik :)

Anyways, debugging is sowieso een core-skill voor ELKE programmeur, en zeker met VStudio is het echt niet moeilijk :) Dat is waarom ik me soms een beetje erger aan mensen die dwars zijn en alles in hun hoofd uitvoeren om de bug te vinden, en daarom vaak iets missen (niet op zijn minst omdat ze zelf de code geschreven hebben en denken "ja dat stuk werkt wel"). We leven niet meer in de 80s op zich :)

Dat gezegd hebbende, er zijn toch wel wat tekortkomingen in de native debugger van VS. De neiging om naar assembler view te gaan als je "compiler-generated" code hit (default copyctor/destructor), de eerder genoemde "syntactic sugar". C# doet het wat dat betreft beter, daar kan je breakpoints zetten per statement (bijv alleen op de conditional branch van een single-line if), en die heeft ook fijnere object-inspector (automatische evaluatie van properties zonder side-effects etc)

[ Voor 38% gewijzigd door MLM op 01-11-2012 10:57 ]

-niks-


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

@MLM: volgens mij had niemand het over F10 in de context dat je nog niet aan het runnen bent :). F11 doet in die context overigens precies hetzelfde.
Step-into kan vaak nogal wat irrelevante code doorploegen in C++ (zoals (copy)-constructors/destructors van temporaries, overloaded operators, conversion operators, smart-pointer dereference etc), dat is waarom ik toch meer F10 dan F11 gebruik
Ik gebruik F11 alleen als ik ergens *in* wil steppen (daar is ie immers voor bedoeld). Alleen kun je dan soms eerst wat andere bijzakelijke dingen tegenkomen, een combinatie van F11 en Shift-F11 (step out) is dan je vriend :)

[ Voor 83% gewijzigd door .oisyn op 01-11-2012 11:24 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1