Article View: be.comp.programming
Article #7986[c] eigen getline vereist soms een extra enter voordat hij werkt
From: Sven Vermeulen
Date: Thu, 11 Jul 2002 08:56
Date: Thu, 11 Jul 2002 08:56
107 lines
3353 bytes
3353 bytes
Ieps,
Ik heb een getline-functie gemaakt die als volgt werkt (overgenomen van
verschillende websites):
void getline(char s[], int lim)
{
int c = 0, j;
while (getchar() != '\n');
for (j = 0; j < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++j)
s[j] = c;
}
Ergens in m'n programma gebruik ik volgende code:
printf("Name: ");
getline(person.name, 30);
printf("Address: ");
getline(person.address, 50);
printf("Postal code: ");
scanf("%d", &person.postal);
printf("City: ");
getline(person.city, 30);
printf("E-mail: ");
getline(person.email, 30);
Hierin is person gedefinieerd als een structure:
typedef struct human {
char name[30];
char address[50];
int postal;
char city[30];
char email[30];
} t_human;
t_human person;
(Niet dat ik denk dat dat ertoe doet, maar gewoon ter volledigheid). Nu
gebeurd het volgende als ik het programma uitvoer:
Name: <hier kan ik m'n naam ingeven>
Address: <1 - return>
<hier kan ik m'n adres ingeven>
Postal Code: <hier kan ik m'n postcode ingeven>
City: <hier kan ik m'n stad ingeven>
E-mail: <2 - return>
<hier kan ik m'n e-mail ingeven>
Bij "1" en "2" kan ik vanalles ingeven, maar wat ik ook ingeef wordt later
niet gesaved. Nu zou ik denken dat dat komt wegens de
while (getchar() != '\n');
die in getline zit, maar als ik die regel eruit haal krijg ik het volgende:
Name: Address: <hier moet ik m'n adres ingeven>
Postal Code: <hier moet ik m'n postcode ingeven>
City: E-mail: <hier moet ik m'n e-mail ingeven>
M.a.w. de "Name: " en "City: " worden dan overgeslagen.
Ik heb ook geprobeerd de regel met
fflush(stdin);
te vervangen maar dit heeft geen effect.
gdb geeft het volgende (step-wise) bij bv "Address: "
Breakpoint 1, getline (s=0x804d3fe "", lim=50) at 12387.c:10
10 int c = 0, j;
(gdb) step
12 while (getchar() != '\n');
(gdb) step
Address:
14 for (j = 0; j < lim - 1 && (c = getchar()) != EOF && c !=
'\n';
++j)
(gdb) step
Leopold II laan 49
15 s[j] = c;
(gdb)
Het is duidelijk dat hij bij de "while" wacht, maar waarom doet hij dat dan
niet bij "Name: " (waar hij het dus wel doet)?
Kent er iemand anders een andere (veilige) manier om strings (met spaties) in
te lezen?
Mvg,
Sven Vermeulen
Technical Details
Message-ID:
<5LbX8.2783$QS3.541@afrodite.telenet-ops.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-01!sn-xit-08!supernews.com!newsfeed.online.be!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: fcea4,e8f39528eabe5a61,start X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2002-07-11 02:05:28 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-01!sn-xit-08!supernews.com!newsfeed.online.be!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail Newsgroups: be.comp.programming From: Sven Vermeulen <svenPUNTJEvermeulen@rug.ac.be> Subject: [c] eigen getline vereist soms een extra enter voordat hij werkt User-Agent: slrn/0.9.7.4 (Linux) Lines: 107 Message-ID: <5LbX8.2783$QS3.541@afrodite.telenet-ops.be> Date: Thu, 11 Jul 2002 08:56:33 GMT NNTP-Posting-Host: 213.224.137.116 X-Complaints-To: abuse@telenet.be X-Trace: afrodite.telenet-ops.be 1026377793 213.224.137.116 (Thu, 11 Jul 2002 10:56:33 MET DST) NNTP-Posting-Date: Thu, 11 Jul 2002 10:56:33 MET DST Organization: Telenet Internet