|
| gets() virker ikke i min menu. Fra : James |
Dato : 21-10-04 22:24 |
|
Hej NG.
Jeg har en funktion som tilføjer elementer til min linked list. I denne
funktion bruger jeg gets() til at fange en streng (ved godt gets() er lidt
af en fy fy funktion, men mit program er kun for at lære c og skal ikke
bruges til noget).
Bruger jeg funktionen 'alene' virker den fint, altså:
int main(){
//laver liked list og hovedet hedder 'head'
add(&head);
}
void add(nod** head){
int i=0;
char stringBuffer[50];
nod* newNod=(nod*)malloc(1*sizeof(nod));
printf("Enter name:\n");
gets(stringBuffer);
newNod->name = (char*)malloc(strlen(stringBuffer));
while(newNod->name[i] = stringBuffer[i])i++;
printf("Enter grade:\n");
scanf("%d", &newNod->grade);
newNod->next = *head;
*head = newNod;
}
dette resultere i følgende:
Enter name: <navn>
//indtaster navn og trykker enter
Enter grade: <grade>
Men hvis jeg sætter det ind i en menu fuker det totalt op, altså sådan her:
while(c){
printf("Choose a number:\n");
scanf("%d", &c);
if(c == 4){
add(&head);
}
}
void add(nod** head){ /*......*/}
Med dette får jeg følgende resultat:
Enter name:
Enter grade:
<name> //indtaster navn og trykker enter
Enter name:
Enter grade:
<grade> //indtaster grade, trykker enter og slut
Godt nok bliver navn og grade sat men der dukker oxo et underligt tal op
som -842150451
Nogen der har nogen anelse om hvad der gaar galdt ?
På forhånd tak
- Christian James
| |
Bertel Brander (21-10-2004)
| Kommentar Fra : Bertel Brander |
Dato : 21-10-04 23:03 |
|
James wrote:
>
> Nogen der har nogen anelse om hvad der gaar galdt ?
At mixe scanf og gets er en dålig idé og kan give
mange sjove fejl. At bruge scanf er i sig selv
en dårlig idé.
Du kunne prøve at bytte din scanf ud med en gets + strtol.
(Og så bør du bruge fgets, det er ikke ret meget
sværre at skrive:
fgets(Buffer, sizeof(Buffer), stdin);
)
--
Juliet: What's in a name? that which we call a rose
By any other name would smell as sweet; ...
Romeo: I take thee at thy word:
Call me but love, and I'll be new baptized;
| |
James (21-10-2004)
| Kommentar Fra : James |
Dato : 21-10-04 23:30 |
|
Ok jeg benytter nu fgets() og gets+strtol, men jeg har stadig samme problem
med at den ikke venter på at jeg indtaster navn.
som det fremgår af funktionen add()
printf("Enter name:\n");
fgets(stringBuffer, sizeof(stringBuffer), stdin);
//Her skal den jo vente på at jeg har indtastet en navn, men den har
åbenbart ingen problemer med at fortsætte og exekver linien printf("Enter
grade:\n");
newNod->name = (char*)malloc(strlen(stringBuffer));
while(newNod->name[i] = stringBuffer[i])i++;
printf("Enter grade:\n");
Jeg fatter det simpelthen ikke, som sagt hvis jeg bare køre add() i main()
uden en while eller switch menu virker den som den men saa snart at den
stoppes ind i en at de løkker går det galt.
| |
Bertel Brander (22-10-2004)
| Kommentar Fra : Bertel Brander |
Dato : 22-10-04 00:23 |
|
James wrote:
> Ok jeg benytter nu fgets() og gets+strtol, men jeg har stadig samme problem
> med at den ikke venter på at jeg indtaster navn.
>
> som det fremgår af funktionen add()
>
> printf("Enter name:\n");
> fgets(stringBuffer, sizeof(stringBuffer), stdin);
> //Her skal den jo vente på at jeg har indtastet en navn, men den har
> åbenbart ingen problemer med at fortsætte og exekver linien printf("Enter
> grade:\n");
> newNod->name = (char*)malloc(strlen(stringBuffer));
> while(newNod->name[i] = stringBuffer[i])i++;
> printf("Enter grade:\n");
>
> Jeg fatter det simpelthen ikke, som sagt hvis jeg bare køre add() i main()
> uden en while eller switch menu virker den som den men saa snart at den
> stoppes ind i en at de løkker går det galt.
>
>
Har du ændret ALLE scanf til fgets ?
Bruger du andre indput funktioner end fgets ?
Du bruger Visual C++ ?
--
Juliet: What's in a name? that which we call a rose
By any other name would smell as sweet; ...
Romeo: I take thee at thy word:
Call me but love, and I'll be new baptized;
| |
James (22-10-2004)
| Kommentar Fra : James |
Dato : 22-10-04 15:54 |
|
"Bertel Brander" <bertel@post4.tele.dk> skrev i en meddelelse
news:417844b6$0$208$edfadb0f@dread12.news.tele.dk...
> James wrote:
> > Ok jeg benytter nu fgets() og gets+strtol, men jeg har stadig samme
problem
> > med at den ikke venter på at jeg indtaster navn.
> >
> > som det fremgår af funktionen add()
> >
> > printf("Enter name:\n");
> > fgets(stringBuffer, sizeof(stringBuffer), stdin);
> > //Her skal den jo vente på at jeg har indtastet en navn, men den har
> > åbenbart ingen problemer med at fortsætte og exekver linien
printf("Enter
> > grade:\n");
> > newNod->name = (char*)malloc(strlen(stringBuffer));
> > while(newNod->name[i] = stringBuffer[i])i++;
> > printf("Enter grade:\n");
> >
> > Jeg fatter det simpelthen ikke, som sagt hvis jeg bare køre add() i
main()
> > uden en while eller switch menu virker den som den men saa snart at den
> > stoppes ind i en at de løkker går det galt.
> >
> >
>
> Har du ændret ALLE scanf til fgets ?
> Bruger du andre indput funktioner end fgets ?
> Du bruger Visual C++ ?
>
> --
> Juliet: What's in a name? that which we call a rose
> By any other name would smell as sweet; ...
> Romeo: I take thee at thy word:
> Call me but love, and I'll be new baptized;
Fik et tip i skolen i dag som var at input bufferen ikke var tom da jeg
kalder min fgets(). Jeg løste i hvert fald problemet ved at flushe input
bufferen inden jeg kalder fgets().
| |
Bertel Brander (22-10-2004)
| Kommentar Fra : Bertel Brander |
Dato : 22-10-04 19:53 |
|
James wrote:
> Fik et tip i skolen i dag som var at input bufferen ikke var tom da jeg
> kalder min fgets(). Jeg løste i hvert fald problemet ved at flushe input
> bufferen inden jeg kalder fgets().
>
>
Lad os se hvad de vise fædre af C synes om den løsning,
de skriver om fflush:
"If stream points to an output stream or an update stream in which
the most recent operation was not input, the fflush function causes
any unwritten data for that stream to be delivered to the host
environment to be written to the file; otherwise, the behavior is
undefined."
Det er muligt at din løsning "virker" på din platform med den version
af kompileren du bruger i dag. Men hvad der sker på en anden platform
med en anden kompiler er er umuligt at forudsige.
C-standarden sætter ingen begrænsninger for hvad der kan ske ved
"undefined behavior"
--
Juliet: What's in a name? that which we call a rose
By any other name would smell as sweet; ...
Romeo: I take thee at thy word:
Call me but love, and I'll be new baptized;
| |
|
|