나는 프로그래밍 수업을하는 친구를 돕고 있으며, 우스운 이야기를 접했습니다. 코드는 다음과 같습니다.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는 그것을 좋아하지 않고 그것을 실행할 때마다 내 프로그램을 충돌 시켰습니다.
누군가가 왜 작동하지 않는지 설명 할 수만 있다면, 나는 영원히 감사 할 것입니다.
'scanf ("% s", & continuar);'continuar'는 단일'char' 유형입니다. 문자열 입력이 해당 주소에서 2 자 이상이므로 시스템을 중단합니다. –
* 정의되지 않은 행동 * 후에 무슨 일이 일어 났는지 설명하는 것은 사실이 아닙니다. 그러나 가정은 만족 스러울 수 있습니다. 'i'가 스택에서 연속적으로 위에 있기 때문에 ** 문자열에 대한 데이터를 입력 할 때''s ''는''char continuar''로 가고''\ 0 '은 [리틀 엔디안] (https://en.wikipedia.org/wiki/Endianness) 변수의 최하위 바이트'i'로 이동합니다. 입력을하기 전에'i' *를 증가 시켰기 때문에'i'의 최소 sig 바이트를'0'으로 덮어 쓰고, 그 값을'0'으로 클램핑하여 여러분이 보았던 행동을 일으킬 수 있습니다. ***만약***. –