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

학생 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 54257
45414 자전거 체지방 태우기에 좋을까요? [9] bsrabbit* 2020-12-08 745
45413 보드데크 버릴때 어떻게 처리해야할까요? [5] 고구마대장 2020-12-08 850
45412 용평 패키지상품 질문이요 [1] 빙고빙고 2020-12-08 219
45411 웰팍이랑 용평 숙소 추천해주세용... [1] 누쫑이 2020-12-08 388
45410 최고급 삼폐인 싸게 구할 수 있는 곳? [2] 張君™ 2020-12-07 533
45409 밸브형 마스크 개조(?) [12] 정강냉이 2020-12-06 689
45408 이 충전 케이블 타입 명칭 궁금합니다ㅜ file [8] 니베아원영 2020-12-05 818
45407 최근에 보드코리아 방문하신분 있나요? [6] 바네스코 2020-12-04 1777
45406 안경 김서림때문에 렌즈착용 [12] 낙엽밖에몰라염 2020-12-04 627
45405 지산리조트 주변에 취사 가능한 곳이... [10] 허접그자체 2020-12-04 538
45404 비발디파크 가려는데 괜찮을까요? [2] 우로롸라라 2020-12-04 703
45403 비발디 시즌권 동반 할인 [3] Editor.R 2020-12-04 201
45402 스텝온주니어 구입처 좌표좀~ [3] 허브나라 2020-12-04 214
45401 광주에서 무주 [1] 로그라이드 2020-12-04 461
45400 아파트 줄눈 질문드립니다 [10] 검은눈사람 2020-12-03 741
45399 100만원 내외 노트북 추천해주세요 [9] 철인보더_83... 2020-12-03 334
45398 휘팍 시즌권 발급 신분증 필요한가요? [4] 마루마루요 2020-12-03 296
45397 강원도 스키장 추천좀 해주세요 형님 누님들 [10] 닉넴좀줘라 2020-12-02 549
45396 헝그리보드는 앱없나요? [7] 만더기 2020-12-02 776
45395 비발디파크 체크카드도 리프트권 할인 적용 되나요? [4] 라이드매니아 2020-12-02 312