[기타묻고답하기 이용안내]

학생 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])

}

//////////////////////////////////////////////// 실행결과 ///////////////////////////////////////

이름을 입력하시오: a
국어점수를 입력하시오: 1
영어점수를 입력하시오: 2
이름을 입력하시오: b
국어점수를 입력하시오: 3
영어점수를 입력하시오: 4
이름을 입력하시오: c
국어점수를 입력하시오: 5
영어점수를 입력하시오: 6


-- 학생 명단 --
이름: (null)국어 : 1영어 : 2
이름: (null)국어 : 3영어 : 4
이름: (null)국어 : 5영어 : 6
계속하려면 아무 키나 누르십시오 . . .
엮인글 :

kucky™

2019.03.26 11:59:17
*.21.59.100

struct student s;

구조체 s 선언하고 s를 초기화 한번 해보세요.
int는 구조적으로 null이 바인딩이 안되서 자동으로 초기화가 되는데 char는 null 을 허용하니 초기화를 한번 해주면 될거 같습니다.

꿀단지푸

2019.03.26 12:37:24
*.103.232.82

와우....

세허니

2019.03.26 12:53:58
*.209.107.41

와...

그믐별

2019.03.26 13:56:29
*.216.38.106

name은 string이 아닌 char형 변수인데 printf 형식지정자를 %s로 하셨네요.
아래와 같이 바꾸는게 나을거 같습니다.


#include <stdio.h>

struct student 
{
char name[16];
int korean;
int english;
float average;
};

int main()
{
struct student s[3];
int i, j;

for (i = 0; i < 3; i++)
{

printf("이름을 입력하시오: ");
scanf("%s", s[i].name);

printf("국어점수를 입력하시오: ");
scanf("%d", &s[i].korean);

printf("영어점수를 입력하시오: ");
scanf("%d", &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("국어 : %d", s[j].korean);
printf("영어 : %d\n", s[j].english);
}

return 0;
}

루디119

2019.03.26 14:11:11
*.253.236.124

일단 정말 진심으로 도와주셔서 감사합니다.

코드를 그대로 돌려보았는데 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;

}


이렇게 수정을 해보았는데요, 입력은 받아지나 

for (j = 0; j < 3; j++)
{
printf("이름: %s", s[j].name);
printf("국어 : %d", s[j].korean);
printf("영어 : %d\n", s[j].english);
}
이쪽 루프가 안돌고 강제종료 현상이 됩니다. ㅠㅠ

그믐별

2019.03.26 14:36:23
*.216.38.106

Visual Studio 사용하시는건가요?

제가 드린 코드는 Linux기반이라 컴파일러가 달라서 빌드오류가 날 수 도 있습니다.

그래서 수정하신 코드를 Visual Studio 2010에서 돌려봤는데 잘 되네요..


int에서 float변환하는건 크게 상관없고...소스코드도 그냥 돌려보기엔 문제없어보이네요.

어머씩군오빠

2019.03.27 08:08:44
*.75.253.245

오~ 완전유식 머쩌요~

그믐별

2019.03.27 11:57:37
*.216.38.106

직업입니다...

루디119

2019.03.27 23:37:53
*.118.95.224

그믐별님 완전 감사합니다!!  제 환경이 문제였네요!! 도와주셔서 감사합니다

용인_병아리

2019.03.26 14:28:30
*.70.55.193

아 제 전공분야라 돕고 싶은데 c를 손놓은지 오래되서 도움이 안될 것 같네요. 현장에서는 java/jscript만 써서..

루디119

2019.03.27 23:38:20
*.118.95.224

전 아직 햇병아리라.. 도움이 많이필요해요 ㅋㅋ

용인_병아리

2019.03.26 14:34:01
*.70.55.193

일단 float 타입인데 %d는 이상하구요.. 제대로 입력 들어오는지는 루프 빼고 개별 항목별로 테스트해보시는게 제일 빠릅니다. 입력값이 정상적으로 들어오는지도, 특히 수 입력이 정상적으로 float형으로 매핑되고 있는지 필히 확인하세요.

루디119

2019.03.27 23:38:48
*.118.95.224

예리하시네요. 감사합니다 ㅎㅎ

언더라욘

2019.03.26 14:38:07
*.62.175.226

학생 여러명 정보를 하나의 구조체에 맴버들의 배열로 관리 하지 마시고 구조채의 배열로 만드세요. 그래야 구조체가 의미가 있습니다.


그리고 지금 이름의 자료형이 char인데 string를 넣고 있어요. 대부분 시스템에서 string 는 char[] + \n의 형태로 되어 있습니다.

입력 형식지정자를 %s 가 아닌 %c 로 변경해보세요.


제일 좋은건 그믐별님 코드 처럼 구조체 배열 형태가 좋습니다.


그믐별님 코드를 살짝 수정하셨는데 마지막에 출력시 형식지정자가 또 틀렸네요. %f로 받으셨으면 %f 로 출력하시거나 정수형으로 출력하시려면 케스팅을 해주셔야 합니다. printf("영어 : %f\n", s[j].english); 또는 printf("영어 : %d\n", (int)s[j].english); 루프가 죽는건 제컴이 윈도가 아니라 ㅠㅠ


루디119

2019.03.27 23:42:04
*.118.95.224

그믐별님이랑 언더라욘님 말씀이 맞더군요.(역시 실무개발자분들!!)

해결법은 그믐별님이랑 언더라욘님의 말씀처럼 구조체 배열로 만드는것이랑, 2차원배열을 사용해서 해결이 가능한것으로

학습되었습니다. 덕분에 소중한 지식 배워갑니다.

진심으로 감사드립니다^^

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
공지 [기타묻고답하기 게시판 이용안내] [1] Rider 2017-03-14 54392
43879 30대 후반 여성 정장 브렌드 추천. [6] 덜렁이 2013-01-08 3182
43878 gif 파일 용량 줄이는 법 아시는 분? [2] 1PONDO 2010-11-16 3182
43877 사이드브레이크등이 가끔 안꺼지네요..ㅠㅠ [12] 휘팍통신원 2011-10-26 3181
43876 아이폰3GS분실폰있잖아요.. [2] 아이폰 2011-01-04 3181
43875 기존 엘피지 차량. 가스통 도넛형 변경 어떻게 생각하세요?? [8] 하늘고고고 2015-10-21 3179
» c언어 오류가나요 ㅠ(프로그래밍) [15] 루디119 2019-03-26 3178
43873 타이어 교체 싸게 하는법있나요?? [16] 보드가이즈 2015-04-06 3178
43872 자동차 이전 등록비용 [3] 9할타자 2017-01-16 3177
43871 모텔 말고 호텔이요 [20] ?? 2015-11-16 3177
43870 가정용 충전드릴 추천좀요 [7] 희룡 2014-08-26 3177
43869 50대엄마 가볍게드실 작은가방추천 [7] 리리 2014-07-27 3177
43868 관세사의 향후 전망은? [2] 일용이 2013-03-25 3177
43867 하이원에서 놀러가기 좋은 가까운 바다는? [7] 부산입니더 2010-11-08 3176
43866 후방십자인대 파열 침 맞아 보신분 계신가요..? [20] 밥주걱 2017-01-16 3175
43865 차량 발수코팅? 레인ok? [20] 순규하앍~♡ 2011-06-29 3175
43864 술안먹는 사람 동호회 활동 어떻게 하나요? [12] 완전술싫어 2011-03-16 3175
43863 회사 화환 보내는 어처구니 없는 상황... [11] 23 2010-11-19 3175
43862 [컴퓨터]동영상 파일 재생 중 블루스크린이 자꾸 뜹니다 [5] 블루스크린 2015-05-10 3174
43861 국산양주 괜찮은거?? [3] lll 2011-04-22 3173
43860 해석좀부탁합니다ㅜㅜ직구 배송관련인건데요ㅠ [2] 보드짱~! 2015-06-04 3172