|
학생 3명의 이름과 국어,영어 점수를 받아서 출력하는 프로그램을 간단히 만들어보았는데요,
오류가 납니다.. char 배열을 출력할 때 NULL 로 출력이 되는데 왜그런걸까요?ㅠ
/////////////////////////////////////// 코드 ///////////////////////////////////////////////
#include <stdio.h>
#include <vector>
#include <conio.h>
int main()
{
struct student {
char name[3];
int korean[3];
int english[3];
float average[3];
};
struct student s;
for (int i = 0; i < 3; i++)
{
printf("이름을 입력하시오: ");
scanf_s("%s", &s.name[i], sizeof(s.name[i]));
printf("국어점수를 입력하시오: ");
scanf_s("%d", &s.korean[i], sizeof(s.korean[i]));
printf("영어점수를 입력하시오: ");
scanf_s("%d", &s.english[i], sizeof(s.english[i]));
s.average[i] = (s.korean[i] + s.english[i]) / 2 ;
}
printf("\n\n-- 학생 명단 --\n");
for (int j = 0; j < 3; j++)
{
printf("이름: %s", s.name[j]);
printf("국어 : %d", s.korean[j]);
printf("영어 : %d\n", s.english[j]);
}
system("pause");
//, 평균:%d \n , s.average[i])
}
일단 정말 진심으로 도와주셔서 감사합니다.
코드를 그대로 돌려보았는데 scanf_s 를 쓰라고 나오더라구요~ 그대로 실행한결과는
1>------ 빌드 시작: 프로젝트: Student_Array, 구성: Debug Win32 ------
1>소스.cpp
1>c:\users\whomi\source\repos\student_array\student_array\소스.cpp(28): warning C4244: '=': 'int'에서 'float'(으)로 변환하면서 데이터가 손실될 수 있습니다.
1>c:\users\whomi\source\repos\student_array\student_array\소스.cpp(20): error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\ucrt\stdio.h(1274): note: 'scanf' 선언을 참조하십시오.
1>c:\users\whomi\source\repos\student_array\student_array\소스.cpp(23): error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\ucrt\stdio.h(1274): note: 'scanf' 선언을 참조하십시오.
1>c:\users\whomi\source\repos\student_array\student_array\소스.cpp(26): error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\ucrt\stdio.h(1274): note: 'scanf' 선언을 참조하십시오.
1>"Student_Array.vcxproj" 프로젝트를 빌드했습니다. - 실패
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========
이렇게 나와요. 그래서 제가 scanf 대신 scanf_s 를 쓰고,
1>c:\users\whomi\source\repos\student_array\student_array\소스.cpp(28): warning C4244: '=': 'int'에서 'float'(으)로 변환하면서 데이터가 손실될 수 있습니다. <<< 이부분을 해결하기 위해서 일단은 전부 float으로 바꿨습니다.
바꾼코드는
#include <stdio.h>
struct student
{
char name[16];
float korean;
float english;
float average;
};
int main()
{
struct student s[3];
int i, j;
for (i = 0; i < 3; i++)
{
printf("이름을 입력하시오: ");
scanf_s("%s", s[i].name, sizeof(s[i].name));
printf("국어점수를 입력하시오: ");
scanf_s("%f", &s[i].korean, sizeof(s[i].korean));
printf("영어점수를 입력하시오: ");
scanf_s("%f", &s[i].english, sizeof(s[i].english));
s[i].average = (s[i].korean + s[i].english) / 2;
}
printf("\n\n-- 학생 명단 --\n");
for (j = 0; j < 3; j++)
{
printf("이름: %s", s[j].name);
printf("국어 : %f", s[j].korean);
printf("영어 : %f\n", s[j].english);
}
return 0;
}
이렇게 수정을 해보았는데요, 입력은 받아지나
학생 여러명 정보를 하나의 구조체에 맴버들의 배열로 관리 하지 마시고 구조채의 배열로 만드세요. 그래야 구조체가 의미가 있습니다.
그리고 지금 이름의 자료형이 char인데 string를 넣고 있어요. 대부분 시스템에서 string 는 char[] + \n의 형태로 되어 있습니다.
입력 형식지정자를 %s 가 아닌 %c 로 변경해보세요.
제일 좋은건 그믐별님 코드 처럼 구조체 배열 형태가 좋습니다.
그믐별님 코드를 살짝 수정하셨는데 마지막에 출력시 형식지정자가 또 틀렸네요. %f로 받으셨으면 %f 로 출력하시거나 정수형으로 출력하시려면 케스팅을 해주셔야 합니다. printf("영어 : %f\n", s[j].english); 또는 printf("영어 : %d\n", (int)s[j].english); 루프가 죽는건 제컴이 윈도가 아니라 ㅠㅠ
struct student s;