代码页437中有一些特殊字符,我想在打印n-ary树的函数中使用,所以我可以这样做:
http://www.randygaul.net/wp-content/uploads/2015/06/Capture1.png
(基本上类似于linux中的tree
命令)
问题是,我的算法正在使用setlocale(LC_ALL, "Portuguese")
,这会与那些特殊字符混淆。我想知道我是否可以以某种方式单独将C默认语言环境应用于该函数。
答案 0 :(得分:1)
只需保存当前区域设置,然后恢复:
void func_with_my_own_locale(void) {
const char * localesave = setlocale(LC_ALL, NULL);
assert(localesave != NULL); // or some fprintf(stderr, ....);
if (setlocale(LC_ALL, "CP437" /* or "" */) == NULL) {
assert(0);
}
......
if (setlocale(LC_ALL, localesave) == NULL) {
assert(0);
}
}
请注意,locale在进程中的所有线程之间共享,因此您需要在调用此类函数时暂停所有其他线程(或确保它们不调用任何与语言环境相关的函数)。
成功完成后,setlocale()将返回与新语言环境的指定类别关联的字符串。否则,setlocale()将返回一个空指针,并且程序的语言环境不会改变 语言环境的空指针使setlocale()返回指向与程序当前语言环境的类别关联的字符串的指针。
setlocale()返回的字符串是这样的,使用该字符串及其相关类别的后续调用将恢复该程序区域的那部分。