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

학생 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
번호 제목 글쓴이 날짜 조회 수
공지 [기타묻고답하기 게시판 이용안내] [1] Rider 2017-03-14 54251
45554 휘팍에서 지스킷 구매 할수있는곳 있을까요? 도마타기 2021-02-06 169
45553 휘닉스파크 근처 1박2일 할곳 추천부탁드립니다! 높은1 2021-02-06 130
45552 백팩 추천 해주세요!! [6] 민봉___ 2021-02-06 430
45551 강촌 엘리시안 VIP 권이... [2] 허접그자체 2021-02-05 311
45550 코나 타시는분 데크 몇장까지 실어보셨나요? [7] 빔빔23 2021-02-05 360
45549 스키타시는분? [14] 로즈아이 2021-02-04 768
45548 횡계시내 맛집 추천부탁드립니다~ [15] 흡다 2021-02-03 708
45547 보드 부츠 사이즈 고민이에요 [9] 몽블랑에서 2021-02-03 338
45546 이것의 이름을 알려주세요. file [10] 포보 2021-02-02 863
45545 지난 시즌 동양평 나들목 20중 추돌사고 현장 요즘 어떤가요?(영상 참조) [6] 장모님사랑... 2021-02-02 578
45544 9년된 노트북 부품용으로도 못팔까요? file [9] 유블리 2021-02-02 425
45543 넷플에서 볼만한거 추천좀 해주세요!!! [32] 루시안장인 2021-02-02 795
45542 비발디 요즘 사람 많은가요? [6] 굴다리 2021-01-31 460
45541 안흥찐빵이 원래 작나요? [12] 어떤별보다 2021-01-31 504
45540 용인 휴게소 앞 줄 스낵코너 음식 살 수 있을까요? [2] 강실장 2021-01-31 234
45539 롱보드 관련 구매어디서 하나요? [4] 도실장 2021-01-30 252
45538 카톡을 익명으로 보내는게 가능한가요 [4] 용평에살어... 2021-01-29 734
45537 그래픽카드 품귀현상 해결이 될라나요 [7] snowandgolf 2021-01-28 465
45536 유튜브 TTS [4] 김모씨@ 2021-01-27 947
45535 고프로 헬멧 마운트 [4] 오렌지짱 2021-01-27 415