题目三:
http://topic.csdn.net/t/20061008/22/5068270.html
下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位为1)中的大写字母转化为小写字母,请找出其中的bug,注意各种异常情况。
for (char *piterator = szWord; *piterator != 0; piterator++)
{
if (*piterator & 0x80 != 0)
{
piterator++;
}
else if (*piterator >= 'A' && *piterator <= 'Z')
*piterator += 32;
}
Answer1:
http://blog.csdn.net/houdy/archive/2006/09/24/1271448.aspx
!=的优先级比&高。所以应该加括号。
if ((*piterator & 0x80) != 0)
Answer2:
http://topic.csdn.net/t/20061008/22/5068270.html
第一题真正的bug是
if (*piterator & 0x80 != 0)
{
piterator++;
}
这里没有考虑是否是最后一个字节就加了1,假设输入的串是:
char a[] = {0x80, 0};
那么在piterator++之后,for循环又会++,就漏掉了那个0,而去判断一个非法的地址的值是不是等于0,就瓦了。