/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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;

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408183
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste