2014-12-19 1 views
3

"double"을 문자열로 변환하는 두 가지 함수 인 sprintf와 snprintf를 사용하고 있습니다. 하나의 경우, 실행중인 응용 프로그램의 로켈이 Windows 로켈과 다릅니다. 그래서, sprintf가 고려하는 로케일은 항상 응용 프로그램입니다. 반면 snprintf는 Windows 로켈을 사용하기 시작합니다. 결과적으로 두 메소드에서 리턴 된 소수 문자가 서로 다르고 문제가 발생합니다.C++ : sprintf는 어떤 로케일을 고려합니까?

자세한 내용을 보려면 "double"에서 문자열을 만드는 라이브러리가 있습니다.이 라이브러리는 snprintf를 사용하여 double을 문자열로 변환합니다. 그런 다음이 정보를 "이해할 수있는 서버에 보내야합니다." (점)은 십진 기호로만 사용됩니다. 따라서 지역 소수점 문자를 "."로 대체해야합니다. (점). 지역 소수점 문자를 찾으려면 (대체하기 위해) sprintf를 사용하는 프로젝트에서 제공되는 라이브러리 중 하나를 사용하고 있습니다. 그런 다음이 문자를 점으로 대체하여 최종 출력을 얻습니다.

또한 sprintf는 항상 네이티브 응용 프로그램의 로캘을 고려하지만 snprintf는 Windows의 로캘을 고려하는 경우가 있습니다. 문제가 불일치하므로 명확한 예를 제공하지 않아서 유감입니다.

따라서 snprintf가 다르게 동작 할 수있는 상황은 무엇입니까? 왜 이러한 두 가지 방법으로 인해 다른 동작이 발생합니까? 어떻게 피할 수 있습니까?

P. -이 두 가지 방법을 사용해야하므로 다른 방법을 사용하지 않아도되는 솔루션을 제안하십시오.

감사합니다.

+0

'sprintf'와'snprintf' 모두 실제 서식에 대해 동일한 코드를 사용하기 때문에 서로 다르게 행동해서는 안됩니다. 문제를 보여주는 [Minimal, Complete, Verifiable Example] (http://stackoverflow.com/help/mcve)를 제공해 주시겠습니까? –

+0

죄송합니다. 문제가 불일치하므로 Verifiable 예제를 제공해 드릴 수 없습니다. 하지만 간단히 설명하면 코드에서 정확히 무엇을하고 있는지 알 수 있습니다. 내 게시물을 편집했습니다. 감사. – Prasad

+0

@Prasad : 요점은 세 가지 예가 있습니다. 하나는 Minimal, 하나는 Complete이며 마지막은 Verifiable입니다. – MSalters

답변

4

sprintfsnprintf이 모두 사용하는 로켈은 Windows 로켈이지만 응용 프로그램 로캘은 이 아니라입니다. 이 로켈은 응용 프로그램에 대해 전역이므로 프로그램의 모든 코드 행이이를 변경할 수 있습니다. 귀하의 경우에는

는 일시적으로 snprintf 통화 로케일을 대체 할 수 있습니다 솔루션 (안전 스레드되지 않음) :

BTW
auto old = std::locale::global(std::locale::classic()); 
snprintf(...); 
std::locale::global(old); 

은 "윈도우 로케일이"단지 std::locale(""), 당신이 돈을 통해 액세스 할 수 있습니다 정확한 이름을 알아야합니다.

+0

이미 언급했듯이 프로젝트에서 제공 한 라이브러리 만 사용해야합니다. 그러므로 이와 같은 변화를하는 것이 나를위한 최후의 수단이 될 것입니다. 그러나 여전히 당신의 대답은 나에게 방향을 알려주고, 당신은 관련 메소드가 사용하는 로케일이 어플리케이션 로케일이고 윈도우 로케일이 아니라는 것을 아주 기본적인 것에 대한 답을 제공했다. 대단히 고마워! – Prasad

+0

이것은 추가 라이브러리가 아닙니다! 이것은'sprintf'와 마찬가지로 일반적인 C++입니다. – MSalters

관련 문제