반응형

문자를 숫자로, 숫자를 문자로 '변환'하기


프로그래밍을 하다보면 문자열을 숫자로 바꾸거나, 반대로 숫자에서 문자열로 형 변환(casting)을 해야하는 경우가 종종 발생한다.

 

특히 사용자에게 UI를 통해 입/출력을 제공하는 경우 이러한 형 변환이 자주 사용된다.

 

파이썬은 동적타입이면서 강타입 언어 특성도 지니고 있는 언어이다.

즉 자료형을 실행 중(런타임)에 결정하면서, 한 번 결정된 자료형은 암묵적인(Implicit) 형 변환을 지원하지 않는다.

 

그렇기 때문에 만약 파이썬에서 형 변환을 하지 않고 그대로 사용할 경우 다음과 같은 오류가 발생한다.

728x90

1) 문자(str)를 숫자(int)처럼 사용할 경우

total = 0
count = input()
total += count
TypeError: unsupported operand type(s) for +=: 'int' and 'str'

 

2) 숫자(int)를 문자(str)처럼 사용할 경우

count = 10
print("count: " + count)
TypeError: must be str, not int

 

그럼 위와 같은 오류가 발생하지 않도록

파이썬에서 숫자를 문자열로 그리고 문자열을 숫자로 변환하는 방법에 대해 알아보자.

 

문자를 숫자로 변환 - int()


기본적으로 파이썬에서는 형 변환을 하려면 생성자 함수를 사용하면 간편하다.

파이썬에서 문자열을 숫자로 변환하려면 int() 함수를 사용하면 된다.

 

숫자 = int(문자열)

total = 0
count = input()
total += int(count)
print("total: " + str(total))
10
total: 10

 

숫자를 문자로 변환 - str()


반대로, 파이썬에서 숫자를 문자열로 변환하려면 str() 함수를 사용하면 된다.

 

문자열 = str(숫자)

count = 10
print("count: " + str(count))
count: 10

 

반응형
반응형

원인


"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."
"error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."

scanf와 같은 함수 사용 시 C4996 오류가 발생하는 원인과 이유 그리고 해결 방법에 대해서 알아보자.

 

최신 Visual Studio에서 C4996 오류가 발생하는 이유는 scanf, strcpy, fopen 과 같은 함수들을 사용했기 때문인데,

이 함수들은 버퍼 오퍼플로우(BOF) 등의 보안 취약점을 가지고 있으므로 사용을 자제하라는 의미이다.

 

이러한 위험성을 가진 함수들은 C++14 이상에서는 deprecated 되어 있다.

728x90

해결 방법


1. 안전한 함수로 대체 하기 scanf_s, strcpy_s, fopen_s (★Best)

가장 권장되는 방법은 보안 취약점이 해결되는 안전한 함수로 대체하여 사용하는 것이다.

scanf_s, strcpy_s, fopen_s 등의 secure 함수로 대체하여 사용하면 오류가 해결되며, 동시에 취약점도 해결할 수 있다.

scanf_s("%d", &n);

 

2. 매크로 추가 #define _CRT_SECURE_NO_WARNINGS

scanf_s, strcpy_s 등의 함수는 안전하지만 그만큼 쓰기가 번거로운 경우가 있다.

취약점에 민감할 필요가 없는 코드를 작성하는 경우 코드 최상단에 _CRT_SECURE_NO_WARNINGS 를 정의해주면

해당 소스 파일(c, cpp)에서 이전과 같이 안전하지 않은(unsafe) scanf, strcpy, fopen 등의 함수를 사용할 수 있다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

(※주의. '#define _CRT_SECURE_NO_WARNINGS'는 반드시 최상단('#include <studio.h>' 보다 위)에 정의해야 한다.

 

3. 프로젝트 속성에서 SDL 검사 옵션 해제하기

SDL(Security Development Lifecycle) 옵션을 해제해주면 모든 소스 파일에서 안전하지 않은 함수를 사용할 수 있다.

  • [프로젝트 속성] -> [C/C++] -> [SDL 검사]: 아니요(/sdl-) 선택

* SDL(Security Development Lifecycle)이란? 보안 개발 수명주기의 줄임말로서, 개발 프로세스의 모든 단계에서 보안 및 개인 정보 고려 사항을 도입하여 개발자가 매우 안전한 소프트웨어를 구축하고 보안 규정 준수 요구 사항을 해결하며 개발 비용을 줄일 수 있도록 마련된 지침이다.

(출처: Microsoft SDL)


최신 Visual Studio에서 C4996 오류가 발생하는 원인과 이유, 그리고 해결 방법 3가지에 대해서 살펴보았다.

 

가능하면 SDL을 사용해서 취약점이 발생하지 않는 안전한 코드를 작성하는 것을 권장한다.

하지만 학교 과제나 개인 토이 프로젝트를 진행하는 경우라면 해당 옵션을 끄고 사용하면,

조금이나마 더 빠른 개발이 가능할지도 모르겠다.

반응형
반응형

/LTCG 링크 오류 발생 원인


"LINK : /GL로 컴파일한 MSIL .netmodule 또는 모듈이 있습니다. /LTCG를 지정하여 링크를 다시 시작하십시오. /LTCG를 링크 명령줄에 추가하면 링커 성능이 향상됩니다."

주로 Release 모드 빌드 시 발생하는 경고 메시지이다.

컴파일러 속성에서 '전체 프로그램 최적화(/GL)' 옵션이 켜져 있을 때 '전체 프로그램 최적화 안 함' 옵션이 선택되어 있는 경우 발생한다.

 

무시해도 컴파일은 되지만 성능을 위해 해결하는 것이 좋다.

 

728x90

해결 방법


  • [프로젝트 속성] -> [구성 속성] -> [일반] -> [전체프로그램 최적화] : 링크 타임 코드 생성 사용 선택
반응형

+ Recent posts