[완료]VC++6.0과 2008의 실행차이가ㅠㅠ
글쓴이: 프리노다 / 작성시간: 화, 2009/02/24 - 11:44오후
요즘 VC++ 6.0을 활용해서 C 공부하고 있는데요..;;
간단한 예제를 2008에서 실행시켜보니 이상한 오류가 뜨더군요...ㅠ
#include
int main(void)
{
unsigned char a;
printf("값을 입력하세요(0~127) : ");
scanf_s("%d",&a);
printf("이 값은 %c입니다.",a);
return 0;
}
이 코드를 6.0에서 실행할때는 문제가 없는데 2008에서 실행시키니
디버그 에러라고 뜨면서 "Run-Time Check Failure #2-Stack around the variable'a' was corrupted."
이렇게 뜨는데요;; 뜨면서 중단을 누르니 무사히 실행완료는 됩니다...
2008에서 이 코드에 또 특별한 걸 요구하는건가요??
2008에서 scanf에 _s를 요구해서 이것도 추가시켜봤지만 오류는 그대로군요...
Forums:
scanf_s("%d",&a); 이부분
scanf_s("%d",&a);
이부분을 %c로하던지..
아니면 변수형을 바꿔야 맞을것 같습니다.
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
음...;;
위의 예제의 요지는 숫자를 입력받아서 아스키코드 값의 알파벳을 출력받는거라서여;;
scanf_s부분을 %c로 바꾸는건 의미가 안맞는것 같습니다...ㅠ
물론 변수형을 int로 바꾸니 실행은 잘되는데요 ^^
근데 왜 char형을 쓰면 에러가 나는 거죠??;;ㅠ
분명 0~127의 범위를 지켰는데 말이죠 ㅠ
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
0~127 범위를
0~127 범위를 지키시더라도 2진수로는 0000 0000 0000 0000 0000 0000 0000 0000 ~ 0000 0000 0000 0000 0000 0000 0111 1111 이기 때문에 그렇습니다. %d로 받으면 4바이트죠. %c로 받음 1바이트고...
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
이런...ㅎ
char형은 1바이트인데 제가 %d를써서 4바이트로 받아서 오류가 난거였군요....ㅠ
6.0에서는 에러가 안나길래 그냥 그런가보다 하고 썼는데 2008에서 오류가 나는군요 ㅠㅠ
근데 %c로 받으면 문제는 만약에 65란 문자를 입력받았을때 6이라는 숫자가 튀어나와버립니다.;;
%c란 서식문자가 문자 하나만 받아들여서 그런거 같네요;
%d로 받았을때는 아스키코드대로 "A"가 나오는데 말이죠 ㅠ
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
%c 는 입력된 숫자를
%c 는 입력된 숫자를 아스키코드로 변환하는 기능을 제공하지 않습니다. 그저 1바이트를 읽을 뿐입니다.
scanf를 사용할 때 65를 입력한다면 그건 숫자 65를 입력하는 것이 아니라 ascii 코드로 인코딩된 문자 '6' ,'5'를 연달아 입력하는 것이기 때문에 말씀하신 현상이 발생하는 것입니다.
만약 scanf를 통해 숫자 65를 입력받아 그 숫자에 해당되는 ascii 코드를 출력하고 싶다면 아래와 같은 코드를 사용해야 합니다.
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
감사합니다 ㅎ
답변 달아주신분들 감사합니다 ^^
아무래도 6.0에서는 자동형변환이 되었던거 같고여
2008에서는 변환대신 말끔한 지적을 해주는걸로 결론이 난거 같네요 ㅎ
아직 의문점 투성이지만 제가 초보인관계로 그런것 같네요 ㅠㅠ
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
c언어를 배우시는 단계라면....
최선 버전 gcc로 해보시는 게 어떨까요?
당시에도 문제가 많았지만 vc 6.0은 너무 오래된 컴파일러고,
vs2008은 _s와 같이 몇 가지 c언어 자체와는 상관없는 작업이
필요한 경우가 있습니다.
처음에는 문법 자체와 간단한 프로그래밍 방법을 배우는 것이니
가능하면 표준을 많이 준수하는 컴파일러가 괜찮을 것 같다는 생각에
몇 자 남겨 봅니다.
----------------------
Go to the U-City
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
Gcc면...
리눅스에서 이맥스나 vi로 에디터해서 gcc로 컴파일하는 방법인가요??ㅋ
아님 Anjunta라던가 Geany같은 컴파일러도 상관없는건가요?ㅋㅋ
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
윈도우에서라면 MinGW를 쓰셔도 좋을 텐데요
gcc/g++을 윈도우에서 쓴다면, MinGW(http://www.mingw.org/)를 사용하셔도 좋을 겁니다.
윈도우
윈도우 환경이면
dev++을 추천합니다.(gcc 기반)
http://www.bloodshed.net/devcpp.html
http://www.bloodshed.net/dev/devcpp.html
콘솔, command 환경에서 초보자 보고 하라고 하면 엄청 힘드실겁니다.
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
자동으로 형변환이
자동으로 형변환이 일어났다기 보다 메모리를 할당할 때 4byte aligned 형태(4의 배수 형태)로 할당을 하기 때문에 여유 공간이 있어서 문제가 숨겨졌던 것입니다. 실제로 돌아가는 프로그램 상에서 저런 코드를 사용했다면 언제 어디서든지 재앙을 불러일으킬 수있습니다.
아마도 vs 2008에서는 저런 것들에 대한 체크까지도 꼼꼼히 해주는 것 같네요.
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
아직은...ㅠ
아직 포인터를 배운게 아니라 메모리 할당에 대한 형태를 잘 모르겠네요 ㅠㅠ
복학하기전에 독학하는거라 KLDP분들께 도움받는거 말고는 물어볼사람이 없네요 ㅜ
암튼 지적과 가르침 감사합니다^^
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------
참고로... Visual Studio .NET 2003부터...
Visual Studio .NET 2003부터 위와 같이 Stack Overflow가 생기는 현상이 발생하면,
디버그 모드로 빌드한 경우에 런타임-에러를 표시해줍니다.
Visual Studio 6.0이 워낙 옛날 컴파일러라 멍청해요.. ^^;;;
댓글 달기