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

학생 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
46754 오늘 무주 설질 어떤가요?? [2] 굿굿잡 2024-01-12 215
46753 곤지암 렌탈샆 추천좀... 날아버린다 2024-01-12 67
46752 바인딩 나사 구입 [4] seoiil 2024-01-12 320
46751 스페셜게스트 의류 [7] 앵그리거니 2024-01-10 656
46750 보드복 브렌드 아시는분???? file [7] a_u.r.a_ 2024-01-09 1112
46749 학동 맛집추천해주세용! [5] 헬로우쌀 2024-01-08 395
46748 휘닉스파크 스패로우 둔턱에서 공중 두바퀴씩 휙휙 [2] JUAN 2024-01-08 758
46747 지산시즌권 양도기간 [1] 똥미니1 2024-01-08 212
46746 웰리힐리 키커 짐 하나요? [3] 차냐보딩이냐 2024-01-07 278
46745 커피 원두 어디서 사세요 [13] 흐르는강물... 2024-01-07 390
46744 제품이 뭔지 알려주세요ㅠㅠ [4] MacaoDa 2024-01-07 352
46743 에덴벨리 시즌권 질문 file [2] 펠돗 2024-01-05 262
46742 방수 스프레이스 사용하시는 분? [21] BlackSwan 2024-01-05 609
46741 보드복파는 업체 대응 이게 맞는건가? 제가잘못인가 봐주세요 file [5] INJESINNAM 2024-01-03 979
46740 강촌 셔틀버스 고양시에서(주엽, 대화 등등) 대략 얼마나 걸릴까요? [3] jkingston 2024-01-03 173
46739 하이원리조트 픽업 가능식당 [4] 믿어날 2024-01-02 527
46738 오랜만에 아이들이랑 청주에서 어디가 좋을까요? 무주? 하이원? [4] 판다거북 2024-01-02 209
46737 비발디 오늘 가는길 괜찮을까요 [8] 아가베보더 2023-12-31 584
46736 내일 오전에 지산 근처 길 괜찮을까요..? [8] 어썸엠케이 2023-12-31 602
46735 지금 날씨가 경기도만 비내리고 강원도는 눈인가요..? [1] 땐때니 2023-12-30 1170