🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #7986

[c] eigen getline vereist soms een extra enter voordat hij werkt

#7986
From: Sven Vermeulen
Date: Thu, 11 Jul 2002 08:56
107 lines
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-mail

Show 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