Sup*_*GoA 8 c string comparison
前几天我在CodeReview上创建了一个帖子.一个回答我问题的人建议我不要使用strcasecmp()因为"函数是非标准的[并且]这使得[my]代码不可移植." 这就是我使用它的方式:
int playGame()
{
char scanned[3];
printf("Do you wish to play tick-tack-toe?\n");
scanf("%s", scanned);
if(strcasecmp(scanned,"yes")==0)
startGame();
else
{
if (strcasecmp(scanned,"no")==0 || strcasecmp(scanned,"nah")==0 || strcasecmp(scanned,"naw")==0)
{
printf("That's too bad!/nThis program will now end.");
return 1;
}
printf("Not valid input!/nThis program will now end.");
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以更深入地解释为什么strcasecmp()有这些限制?
简短的回答:由于strcasecmp()它不在 C 标准库中,因此它是非标准的。
strcasecmp()在 4.4BSD、POSIX.1-2001 等流行标准中定义。
无大小写函数的定义为挑剔的细节打开了大门。这些通常涉及无大小写比较的正结果或负结果,而不仅仅是 OP 使用的 0 或非 0。尤其:
\n\n\n在 POSIX 语言环境中,strcasecmp() 和 strncasecmp() 的行为就像字符串已转换为小写,然后执行字节比较。其他语言环境中的结果未指定。
\n
这样做的问题是大写和小写字母没有一对一的映射。考虑一个本地人,有E,e但还\xc3\xa9没有--> 。然后“就好像字符串已转换为小写”,\xc3\x89toupper(\'\xc3\xa9\')\'E\'\'E\'有 2 个选择。
作为候选人便携式解决方案,请考虑往返字母(先向上然后向下)以处理非一对一映射的解决方案:
\nint SGA_stricmp(const char *a, const char *b) {\n int ca, cb;\n do {\n ca = * (unsigned char *)a;\n cb = * (unsigned char *)b;\n ca = tolower(toupper(ca));\n cb = tolower(toupper(cb));\n a++;\n b++;\n } while (ca == cb && ca != \'\\0\');\n return ca - cb;\n}\nRun Code Online (Sandbox Code Playgroud)\n如果您不想往返这些值,请使用:
\n ca = tolower(ca);\n cb = tolower(cb);\nRun Code Online (Sandbox Code Playgroud)\n详细信息:toupper()和仅在和范围内tolower()定义。用作intunsigned charEOF* (unsigned char *)a*a可能具有负值。
strcasecmp 不在 C 或 C++ 标准中。它由 POSIX.1-2001 和 4.4BSD 定义。
如果您的系统符合 POSIX 或 BSD 标准,则不会有任何问题。否则,该功能将不可用。
| 归档时间: |
|
| 查看次数: |
10508 次 |
| 最近记录: |