0

请原谅我使用翻译器。

我是编程初学者。

几十年前的圈泥正在被改造。虽然已经本地化,可以在 VC6.0 中实现没有任何问题,但是在迁移到 VS Community 2019 时,韩文名称的输入出现了问题。

游戏太老了,韩国的大部分社区都消失了,所以我找不到帮助,就去参观了。我希望我能说一口流利的英语,但是...

输入韩语(CP949 或?)将导致 ishanalp() 崩溃。当我添加/J并编译它时,韩文输入没有崩溃,但我无法识别韩文名称。

移除 isalpha() 部分将允许访问游戏,但在打印或存储名称的区域会发生崩溃。

调试断言失败!

文件; isctype.cpp 行:36

表达式:c >= -1 && c < 255

#define ishan(ch) (((ch) & 0xE0) > 0x90)
#define ishanasc(ch) (isascii(ch) || ishan(ch))
#define ishanalp(ch) (isalpha(ch) || ishan(ch))
#define isnhdigit(ch) (!ishan(ch) && isdigit(ch))
#define isnhspace(ch) (!ishan(ch) && isspace(ch))

int _parse_name(char *arg, char *name) 
{
int i;
/* skip whitespaces */
for (; isnhspace(*arg); arg++);
     for (i = 0; (*name = *arg); arg++, i++, name++)
         if (!ishanalp(*arg)) // here debug assertion failed line 36
             return 1;
         if (!i)
            return 1;
            return 0;
   }
4

1 回答 1

1

ishanalp(static_cast<unsigned char>(*arg))应该修复它,对isnhspace.

鲜为人知的是,is...字符分类函数不接受char参数,而是接受一个int必须具有unsigned char值或 be的参数EOF。如果char是有符号类型(通常是这样)并且您有一个负值,那么该is...函数可能会失败。

我还建议将这些宏重新编码为内联函数。

于 2019-06-28T08:28:17.203 回答