23. september 1999 - 00:21Der er
23 kommentarer og 2 løsninger
cin.getline springer en linie over
hej, håber ikke i er ved at værer alt for trætte af mine spørgsmål, men her er altså noget jeg overhovedet ikke forstår. følgende streams skal indsamle data fra brugeren cout<<setw(10)<<"indtats personens navn: "<<endl; cin.getline(navn,sizeof(navn)); cout<<setw(10)<<"indtast Adresse"<<endl; cin.getline(adresse, sizeof(adresse)); Når jeg starter programmet skulle der stå indtast personens navn $promt<< men den springer navn over og går direkte til næste cout/cin adresse jeg følger anvisningerne i min bog og har kigget i online doc for Borland c++ builder 4.0. Er der nogen der ved hvorfor? Jeg kan poste hele sourcen hvis grundlaget her er for lidt! Hilsen Simon
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Udover at mine versioner af C++ (TC 3.0 og BC5.02) ikke vil kendes ved setw(), så vil jeg helt sikkert tro at det problem du løber i er, at længden af det du indtaster overstiger de 10 tegn der kan være i navn. getline(s, l, x) virker nemlig sådan at den ENTEN læser så mange tegn der er før x ELLER max l tegn. Hvis du så rent faktisk har indtastet flere, vil næste getline blot hente dem - fordi de er afsluttet med x (som normalt er enter). Hermed vil det for dig se ud som om nr. 2 getline springes over.
Jeg har kopieret din kodestump ind i et lille program (setw() udeladt), og får præcis det problem du beskriver, hvis jeg indtaster mere end 10 tegn i første omgang. Hvis jeg ikke gør - så virker det fint.
Jeg vil foreslå dig at ændre din logik til at bruge get i stf. getline - med get kan du vha. et lille loop selv bestemme hvor mange tegn der skal reageres på.
Generelt mener jeg ikke at nogen af standard funktionerne til indlæsning af tekststrenge, tal osv. fra skærmen er gode nok - der er simpelthen for lidt muligheder for at styre hvad der kan/må indtastes. Jeg endte i sin tid derfor med at lave min egen readkey() og readstr() rutiner - inkl. hotkey funktioner og styr på decimaler, fortegn osv. for numeriske værdier.
soepro >> setw() definerer udskriftsbredden. Dvs, at der udskrives i et felt, på 10 tegn og det følgende udskrives derfra. Du kan bruge det, hvis du laver tabeludskrift f.eks. Men når du udskriver en streng på mere end de 10 tegn, så skriver man bare ud over feltet og funktionene får ingen betydning. Hvor får du i øvrigt de 10 tegn fra. De 10 i setw() har ikke noget med indlæsningen at gøre! I øvrigt er jeg enig - jeg har også selv været nødt til at lave mine egne indlæsningsrutiner - blandt andet for at kunne bruge funktionstaster.
simon >> prøv evt. at tømme strømmen efter indlæsning (det er nok noget med flush())
jinxed >> Måske fordi det er mere intuitivt? Næh, men hvordan skal han ellers have erklæret dem (ups, jeg mente char navn[MAX])? Det er svært at slappe af, når man sidder på arbejde og skal lave noget kedeligt, men beklager hvis jeg virker emsig (jeg er bare engageret;-)
uha, ser ud til jeg fik startet en større debat om i/o streams :-) jeg sidder her og prøver at få soepro´s ide om at indlæse et tegn af gangen. noget i retning af while(!navn)//er jo et string array ikke? { navn=cin.get(); } men det virker ikke
ok nu begynder det at blive trals, det virker ok med for løkken, men de springer bare endnu flere linier over, er der en af jer der har et brugbart eksempel.
Ok, du kan lave en funktion over følgende skabelon, som kan udvides meget:
#define F1 <nummer> // Kan ikke huske det i hovedet
int index=0; do { tast=getch(); if(!tast) // Hvis funktionstast med nul-byte switch(getch()) { case F1: hjaelp(); break; ... } else navn[index++]=tast; } while(tast!=RETURN); navn[index]='\0';
Og vupti, så har du din egen indlæsningsfunktion med mulighed for at bruge funktionstaster:-)
bjarke >> Meningen kendte jeg godt - jeg kunne bare ikke finde frem til header-filen.
shj >> Din løsning HAR jeg prøvet - men jeg kan ikke få den til at begrænse antallet af tegn, så brugeren kan indlæse - og dermed at jeg kun får læst den jeg kan aflevere i navn. På mig virker det somom cin bare læser derudaf indtil der bliver trykket på ENTER. get kommandoen aflevere derefter det ønskede antal tegn og gemmer resten til næste kald - og det er vel det du vil undgå ikke.
soepro >> nej, det kan man vist ikke (begrænse antallet af tegn der kan indtastes - heller ikke med scanf() eller nogen anden funktion - jo getch() selvfølgelig;-). Netop derfor vil det også være smartere at lave sin egen indlæsningsfunktion (som du jo allerede selv har skrevet). Men alt det vidste du vel godt(?)
simon >> selvfølgelig skal der lige en stopklods i ovenstående kode, så der ikke indlæses for mange tegn.
while ændres til: while( tast!=RETURN && index<sizeof(navn) );
Desuden skal man også lige kunne se det indtastede, så prøv at ændre getch() til getche()
Hej igen! Jeg poster lige hel mit program, for det virker ikke rigtigt når jeg prøver det i foreslår. Ta jer ikke af den omgang spaghetti programmering det er blevet til ,det er et træningsprojekt jeg har gang i, og jeg er jo totalt newbie i c++ endnu //#include <condefs.h> #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <string.h> #include <iomanip.h> #include <conio.h> int getch(void); //---------------------------------------------------------------------------
void main(void) { char navn[64]; char adresse[64]; char telefon[11]; float gage = 0; char cprnr[11]; char valg; cout <<setw(25)<<"Mit person program"<<endl; cout<<endl; cout<<"hvad vil du fortage dig tast 1 eller 2 eller 3"<<endl<<endl; cout <<"1 Indtaste ny person i registret"<<endl; cout <<"2 find en person i registret"<<endl; cout <<"3 Slette en person fra registret"<<endl; cin>>valg;
Puha, det har jeg ikke tid til lige nu, men et par hurtige bemærkninger:
1) Du behøver vist ikke iostream.h når du har fstream.h (?) 2) int getch(void). Drop den, du skal ikke selv definere funktioner med samme navn som eksisterende c-funktioner! 3) Brug valg=getch() (eller getche()) i stedet for cin >> valg, så slipper brugeren for at indtaste for mange tegn, samt at trykke return. 4) Læg de forskellige dele af programmet ud i hver deres funktion. 5) Saml så funktionskaldene i en switch-case sætning 6) Og smid til sidst det hele (menuen og switch-case sætningen med funktionskaldene ind i en do-while løkke). 7) Lav evt. indlæsningerne om til:
int index=0; do { navn[index++]=getche(); } while(tast!=RETURN && index<sizeof(navn)); navn[index]='\0';
Så skulle programmet blive noget mere letlæseligt og systematisk - og prøv så at se hvordan det virker efter det!
Hej !! jeg kan ikke få min compiler til at acceptere while(tast!=RETURN); den broker sig over RETURN, er det defineret i en header fil eller skal jeg lave noget i stil med #define RETURN <char nummer> og hvad er char nummeret Hilsen Simon
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.