안녕하세요 프로그래밍 늅이입니다. 프로그래밍 공부하다가 계속 오류떠서 질문드립니다.
0xFEFEFEFE에(문자와 문자열 입력 p077.exe의) 처리되지 않은 예외가 있습니다. 0xC00001A5: 잘못된 예외 처리기 루틴이 검색되었습니다(매개 변수: 0x00000003
---------------------------------------------------------------------------------------------------------------------------------------------------------안녕하세요 프로그래밍 시작한지 얼마 안된 학생입니다. 제가 지금 문자와 문자열 부분을 공부하고 있는데 예제보고 따라하고 있는데 저장하고 컴파일링을 하면 계속 오류가 위 메세지 처럼 뜨는데 분명 예제랑 차이가 없는데 뭐가 문제일까요??고수분들 도와주세요 ㅠㅠ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
#include <stdio.h>
int main(void)
{
char grade;
char name[20];
printf("학점 입력 : ");
scanf_s("%c", &grade);
printf("이름 입력 : ");
scanf_s("%s", name);
printf("%s의 학점은 %c입니다. \n", name, grade);
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------------------------
이게 컴파일링한 내용들이에요!
scanf_s 함수 사용법이 잘못 되어 있어서 수정해보니
오류없이 작동이 잘됩니다.
[수정 소스 코드]
#include <stdio.h>
#include <windows.h>
int main(void)
{
char grade;
char name[20];
printf("학점 입력:");
scanfs("%c", &grade, sizeof(grade)); //scanfs("%c", &grade) 사용법 오류
printf("이름 입력:");
scanfs("%s", name, sizeof(name)); // scanfs("%s", name) 사용법 오류
printf("%s의 학점은 %c입니다.\n", name, grade);
system("pause");
return 0;
}
[실행결과 캡쳐]
안녕하세요. 작성하신 글로는 정보를 얻기가 조금 부족한 감이 있습니다.
그러나 코드를 보면 의심될 만한 곳이 2군데가 있습니다.
1. scanf_s("%c", &grade);
여기서 어떤 값이 입력되었는지 궁금합니다.
2. scanf_s("%s", name);
여기서 어떤 값이 입력되었는지도 궁금합니다.
컴파일 에러를 보면
0xFEFEFEFE에(문자와 문자열 입력 p077.exe의) 처리되지 않은 예외가 있습니다. 0xC00001A5: 잘못된 예외 처리기 루틴이 검색되었습니다(매개 변수: 0x00000003
무엇인가 입력한 값이 메모리를 벗어난거 같아요. 예를 들어보겠습니다.
위에서 2번 name은 20개의 문자열 입니다. 즉 20Byte를 입력 받아야만 하죠.
그런데 name 에 들어가 값을 터무니 없는 값이 긴 문자열이 들어오죠. 예를들어 '홍길동' 이 아닌 '홍길동어머니이름은어쩌고저쩌고 '
이렇게 되면 20Byte를 훌쩍넘어 버리고 메모리 exception 이 발생하게 됩니다.
위의 내요은 단순히 추정일 뿐입니다. 문법적으로는 코드에서 오류를 찾을수 없습니다. 디버깅을 하나씩 해볼뿐이죠.
디버깅을 하는것도 결국 실력으로 쌓이는 것이니, 의심되는 2곳에 적절한 값을 넣어 보시기 바랍니다.
- #include <stdio.h> int main(void) { char grade; char name[20]; printf("학점 입력 : "); scanf_s("%c", &grade); printf("이름 입력 : "); scanf_s("%s", name, sizeof(name)); printf("%s의 학점은 %c입니다. \n", name, grade); return 0; }
scanf_s의 경우 사용할 buffer 사이즈를 명시해줘야 합니다.
scanf_s("%s", name); -> scanf_s("%s", name, sizeof(name));
보통 과제라면 scanf를 쓰실 텐데 보안 이슈때문에 scanf_s를 쓰신 것 같네요.
https://bloodstrawberry.tistory.com/5?category=969281
위 블로그에서 scanf 보안 해제 하는 방법은 참고하세요.
Project -> 속성 -> 구성 속성 -> C/C++ -> 일반 -> SDL 검사 -> 아니오 로 변경하면 됩니다.
안녕하세요.
scanf_s의 parameter가 하나 빠졌습니다.
scanf와 달리 scanf_s는 변수의 크기를 parameter로 추가해 주어야 합니다.
아래와 같이 수정하여 실행해 보세요.
================================
printf("학점 입력 : ");
scanf_s("%c", &grade, sizeof(grade));
printf("이름 입력 : ");
scanf_s("%s", name, sizeof(name));