none
간단한 C언어 예제. scanf 오류 RRS feed

  • 질문

  • 간단한 펙토리얼 구하기 예제를 만들었고 코드는 다음과 같습니다.

    코드블럭에서는 돌아가는데 비쥬얼 스튜디오에서는 돌아가지 않네요.

    구체적으로 어떤 문제인지 알고 싶습니다.

    코드

    ==== 

    #include <stdio.h>

    int factorials(int result);

    void main(void)
    {
     int data = 0;

     printf("!값을 구하고 싶은 수를 입력 =>");
     scanf("%d", &data);
     printf("\n%d\n", factorials(data));

    }

    int factorials(int result)
    {
     if (result == 1)
      return 1;

     else
      return result*factorials(result - 1);
     
     
    }

    ====

    2015년 10월 1일 목요일 오전 12:11

답변

  • 오류가 날 가능성을 정리해보면~

    1. 프로젝트를 안만들고 컴파일을 시도하셨거나

    2. 프로젝트가 생성되고 가장 위쪽에 있는 #include "stdafx.h" 를 지워버렸거나

    3. 오류는 아니지만 scanf 함수에 경고 나오는거 말하시는거면 scanf_s 로 함수 이름만 변경해 주시면 됩니다.

    그 외에는 오류 날게 없네요. 위 3가지중에 하나가 아니라면 어떤 오류인지 알려주세요~

    • 답변으로 표시됨 김철민 2015년 10월 1일 목요일 오전 7:27
    2015년 10월 1일 목요일 오전 2:50
    중재자

모든 응답

  • 정상적으로 만드셨는데요... 구체적으로 어떻게 안 돌아가는지 더 설명이 필요합니다.
    2015년 10월 1일 목요일 오전 12:23
  • 오류가 날 가능성을 정리해보면~

    1. 프로젝트를 안만들고 컴파일을 시도하셨거나

    2. 프로젝트가 생성되고 가장 위쪽에 있는 #include "stdafx.h" 를 지워버렸거나

    3. 오류는 아니지만 scanf 함수에 경고 나오는거 말하시는거면 scanf_s 로 함수 이름만 변경해 주시면 됩니다.

    그 외에는 오류 날게 없네요. 위 3가지중에 하나가 아니라면 어떤 오류인지 알려주세요~

    • 답변으로 표시됨 김철민 2015년 10월 1일 목요일 오전 7:27
    2015년 10월 1일 목요일 오전 2:50
    중재자
  • 안녕하세요, 김철민 님.
    Microsoft MSDN의 Forum 사이트를 방문해 주셔서 감사합니다.
    문의 하신 "간단한 C언어 예제. scanf 오류" 문의에 대한 답변을 드리겠습니다.

    문의해 주신 내용을 그대로 Visual Studio 2015 / Windows 10 에서 실행했는데 결과 값이 잘 보여집니다.

    단 scanf 함수의 경우 Buffer Overrun 때문에 deprecate(폐지)된 함수 이므로 disable deprecation하기 위해  _CRT_SECURE_NO_WARNINGS을 사용하라는 경고 메시지가 나옵니다.

    1>c:\users\smpark\documents\visual studio 2015\projects\scanftest\scanftest\scanftest.cpp(15): warning 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.

    _CRT_SECURE_NO_WARNINGS을  C/C++ 전처리기 정의에서 추가하는 방법은 다음 웹 문서를 참고하십시요.
    http://norus.tistory.com/7
    비주얼 스튜디오 2013에서 "This function or variable may be unsafe" 에러

    프로젝트 속성에서  C/C++ 전처리기에 _CRT_SECURE_NO_WARNINGS;를 추가합니다. 반드시 세미콜론(;) 추가하십시오.
    프로젝트 빌드후 실행하면 다음과 같이 잘 실행됨을 확인하실수 있습니다.

    C:\Users\smpark\Documents\Visual Studio 2015\Projects\scanftest\Debug> scanftest.exe
    !Please Enter Number for Factorials =>5

    120

    제시해 드린 답변이 도움이 되었기를 바랍니다.
      
    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다

    2015년 10월 1일 목요일 오전 3:59
  • scanf를 scanf_S로 변경하니 정상적으로 컴파일 되었습니다!

    감사합니다. 그런데 scanf를 사용하면 정상적으로 컴파일 되지 않는 것인가요?

    2015년 10월 1일 목요일 오전 7:28
  • 아닙니다~ 경고는 나오지만 컴파일은 정상적으로 되어야 합니다~

    사용하시는 VC++의 기본 설정에 따라 차이는 있지만 해당 경고가 안전성이 개선된 함수가 scanf_s이니까 이 함수를 사용하라는 뜻이라서 사용안해도 컴파일되고 정상적으로 동작해야 합니다.

    어떤 버전을 사용하시는지 그리고 에러문구가 어떻게 나오는지 적어주시면 확인해드리겠습니다~

    2015년 10월 1일 목요일 오후 1:37
    중재자
  • 단 scanf 함수의 경우

    Buffer Overrun 때문에 deprecate(폐지)된 함수 이므로 disable deprecation하기 위해  _CRT_SECURE_NO_WARNINGS을 사용하라는 경고 메시지가 나옵니다.

    1>c:\users\smpark\documents\visual studio 2015\projects\scanftest\scanftest\scanftest.cpp(15):warning 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.

    _CRT_SECURE_NO_WARNINGS을  C/C++ 전처리기 정의에서 추가하는 방법은 다음 웹 문서를 참고하십시요.
    http://norus.tistory.com/7
    비주얼 스튜디오 2013에서 "This function or variable may be unsafe" 에러

    프로젝트 속성에서  C/C++ 전처리기에 _CRT_SECURE_NO_WARNINGS;를 추가합니다. 반드시 세미콜론(;) 추가하십시오.
    프로젝트 빌드후 실행하면 다음과 같이 잘 실행됨을 확인하실수 있습니다.

    2015년 10월 1일 목요일 오후 6:36
  • 2015버전을 사용하고 있고

    심각도코드설명프로젝트파일줄
    오류 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. ConsoleApplication1 e:\dropbox\visual studio\consoleapplication1\consoleapplication1\factorials.c 10 라는 에러 메세지가 뜹니다. 이 상태로 실행시키면 빌드에서 오류가 발생하였다고 뜹니다.   

         
    2015년 10월 1일 목요일 오후 10:14
  • 프로젝트 속성 창에서 "구성속성" -> "C/C++" -> "일반" 에 보시면 "SDL 검사" 라는 항목이 있는데,  이항목을 보통 "아니요" 로 설정해놓기 때문에 C4996이 경고로 처리되고 컴파일이 됩니다. 만약 이 항목을 "예"로 설정하게 되면 C4996 이 오류처리되어 컴파일이 실패하게 되니, 확인하시기 바랍니다.

    좀더 보안이 적용된 코드를 확실하게 사용하고 싶은 경우 SDL 검사를 "예"로 설정해놓고 사용하는 경우가 있는데, 지금 그렇게 사용하신것 같네요. 이 항목을 "예"라고 사용한것이 잘못되었다는 뜻이 아닙니다~ 상황에 따라 선택해서 사용하면 됩니다~

    2015년 10월 2일 금요일 오전 12:49
    중재자