2016-06-07 6 views
-3

Ich helfe einer Freundin mit ihrem Programmierkurs und wir sind auf etwas komisches gestoßen. Wir haben den Code:i ++ funktioniert nicht in einer While-Schleife

void ingresardatos(struct alumno *lista){ 
int i=0; 
char continuar='s'; 
while(continuar=='s' && i<20){ 
    printf("Valor de i al iniciar: %d \n", i); 
    printf("Introduzca el nombre del alumno:\n"); 
    scanf("%s",&(lista[i].nombre)); 
    printf("Introduzca la matricula:\n"); 
    scanf("%s",&lista[i].matricula); 
    printf("Introduzca la primera calificacion:\n"); 
    scanf("%f",&lista[i].calf1); 
    printf("Introduzca la segunda calificacion:\n"); 
    scanf("%f",&lista[i].calf2); 
    printf("Introduzca la tercera caificacion:\n"); 
    scanf("%f",&lista[i].calf3); 

    lista[i].prom=(lista[i].calf1+lista[i].calf2+lista[i].calf3)/3; 

    if(lista[i].prom<=5.9){ 
     strcpy(lista[i].nota,"NA"); 
    } 
    else if(lista[i].prom>=6 && lista[i].prom<=7.3){ 
     strcpy(lista[i].nota,"S"); 
    } 
    else if(lista[i].prom>=7.4 && lista[i].prom<=8.6){ 
     strcpy(lista[i].nota,"B"); 
    } 
    else if(lista[i].prom>=8.7 && lista[i].prom<=10){ 
     strcpy(lista[i].nota,"MB"); 
    } 
    printf("Valor de i antes: %d \n", i); 
    i++; 
    printf("Valor de i después: %d \n", i); 
    printf("¿Desea continuar? (S/N)"); 
    scanf("%s",&continuar); 
} 
} 

Es soll eine Notenliste für eine Klasse von 20 sein; Sie geben die Schülerdaten ein, bis Sie "n" drücken, und speichert sie auf einer Liste. Nun habe ich den Zeigerteil herausgefunden (ich kenne Java wirklich, also ist es komisch, an C zu arbeiten), aber was ich nicht herausfinden kann, ist, wie man den i++ Teil funktioniert. Wenn Sie es so ausführen, wie es ist, wird es mit i=0 im ersten Durchlauf beginnen, dann gehen Sie durch den gesamten Code, und schließlich i++ vor der Frage, ob Sie fortfahren möchten (es druckt es auf dem Bildschirm). Aber dann, wenn Sie "s" drücken, um anzuzeigen, dass Sie fortfahren möchten, wird es wieder mit i=0 beginnen, und für das Leben von mir kann ich nicht herausfinden, warum. Ich habe versucht i++, ++i, i=i+1, und so weiter, aber nichts scheint zu funktionieren. Ich habe sogar versucht, i einen Zeiger zu machen, aber Windows mochte es nicht und stürzte mein Programm jedes Mal, wenn ich es lief.

Wenn jemand erklären könnte, warum es nicht funktioniert, wäre ich ewig dankbar.

+3

'scanf ("% s ", & continuar);' - 'continuar' ist ein einzelner' char' Typ. Dadurch wird das System beschädigt, da die Zeichenfolgeneingabe an dieser Adresse mindestens 2 Zeichen lang ist. –

+0

Es ist nicht richtig zu erklären, was nach * undefiniertem Verhalten * passiert ist, aber Vermutungen können befriedigend sein. Es kann * sein, dass, weil "i" gerade über "continuar" auf dem Stapel ist, wenn Sie Daten für eine ** Zeichenkette eingeben ** das ''s'' geht nach 'char continuar' und der Zeichenketten-Terminator' \ 0'' geht zu dem am wenigsten signifikanten Byte der [Little-Endian] (https://en.wikipedia.org/wiki/Endianness) Variable "i". Da Sie 'i' * vor * die Eingabe inkrementiert haben, hat * möglicherweise das niedrigste Sig-Byte von 'i' mit '0' überschrieben, seinen Wert auf '0' geklemmt und das Verhalten verursacht, das Sie gesehen haben. ***OB***. –

Antwort

1
scanf("%s",&continuar); 

Dies sollte sein:

scanf("%c",&continuar); 

Wie Sie ein einzelnes Zeichen lesen in und nicht eine Folge von Zeichen.

Mit scanf("%s", wird es nicht nur in continuar schreiben, aber die Erinnerung um ihn herum (wie viel, hängt von der Anzahl der gelesenen Zeichen) und so Ihre i Variable muss es neben sein und wird zurück zu 0 überschrieben.

Edit:

Wie pro Kommentar des @ weathervane, die solution eigentlich sein sollte:

scanf(" %c",&continuar); 

Seit Sie zuletzt eine Gleitpunktzahl gelesen, die Neue-Zeile (von Ihnen Enter drücken) noch nicht gelesen und würde in den Charakter gesetzt werden.

+0

Nein, es sollte 'scanf ("% c ", & continuar);' mit dem Leerzeichen sein. Sonst liest es die 'newline', die im Eingabepuffer nach' scanf ("% f", & lista [i] .calf3); ' –