2016-06-07 4 views
-3

나는 프로그래밍 수업을하는 친구를 돕고 있으며, 우스운 이야기를 접했습니다. 코드는 다음과 같습니다.i ++가 while 루프에서 작동하지 않습니다.

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); 
} 
} 

20 클래스의 등급 목록이 있어야합니다. "n"을 누를 때까지 학생들의 데이터를 소개하고 목록에 저장합니다. 자, 포인터 부분을 알아 냈습니다. (저는 Java를 정말 알고 있습니다. 그래서 C에서 다소 이상하게 작동합니다.) 그러나 알아낼 수없는 것은 i++ 부분을 만드는 방법입니다. 마치 그것을 실행하면 첫 번째 단계에서 i=0으로 시작한 다음 모든 코드를 살펴보고 마지막으로 i++을 수행 한 다음 계속할지 묻습니다 (화면에 출력). 하지만 계속하려면 "s"를 눌러 계속 진행하면 i=0으로 다시 시작되며, 내 인생에서 나는 이유를 알 수 없습니다. 나는 i++, ++i, i=i+1 등을 시도했지만 아무것도 작동하지 않는 것 같습니다. 나는 심지어 i 포인터를 만들려고 시도했지만 Windows는 그것을 좋아하지 않고 그것을 실행할 때마다 내 프로그램을 충돌 시켰습니다.

누군가가 왜 작동하지 않는지 설명 할 수만 있다면, 나는 영원히 감사 할 것입니다.

+3

'scanf ("% s", & continuar);'continuar'는 단일'char' 유형입니다. 문자열 입력이 해당 주소에서 2 자 이상이므로 시스템을 중단합니다. –

+0

* 정의되지 않은 행동 * 후에 무슨 일이 일어 났는지 설명하는 것은 사실이 아닙니다. 그러나 가정은 만족 스러울 수 있습니다. 'i'가 스택에서 연속적으로 위에 있기 때문에 ** 문자열에 대한 데이터를 입력 할 때''s ''는''char continuar''로 가고''\ 0 '은 [리틀 엔디안] (https://en.wikipedia.org/wiki/Endianness) 변수의 최하위 바이트'i'로 이동합니다. 입력을하기 전에'i' *를 증가 시켰기 때문에'i'의 최소 sig 바이트를'0'으로 덮어 쓰고, 그 값을'0'으로 클램핑하여 여러분이 보았던 행동을 일으킬 수 있습니다. ***만약***. –

답변

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

이 있어야한다 :

단일 문자가 아닌 문자의 문자열로 읽을 때
scanf("%c",&continuar); 

.

scanf("%s"으로 만 continuar에 쓰지 않습니다하지만 주위의 메모리가 옆에 있어야하며 그래서 당신의 i 변수 (얼마나 많은 문자 수 읽기에 따라 다름) 및 0 다시 덮어 씁니다. (당신이 키를 눌러 입력에서)

scanf(" %c",&continuar); 

마지막 부동 소수점 수, 줄 바꿈을 읽을 수 있기 때문에 여전히 읽을되지 않습니다

@의 변덕의 코멘트 당으로, solution 실제로해야한다 : 편집

그리고 캐릭터에 넣을 수 있습니다.

+0

아니요, 공백으로'scanf ("% c", & continuar);가되어야합니다. 그렇지 않으면'scanf ("% f", & lista [i] .calf3); 입력 버퍼에 남아있는'newline'을 읽습니다. –

관련 문제