C练习-(四)

/**
1.int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.
如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001
*/

#include <stdio.h>
unsigned int intvert(unsigned int x, int p, int n)
{
//参数需要判断,p + n < ? && p、n都是大于0的数
	int i = 0, temp = 1;
	//循环使得特定位变化,改变一次x的特定位
	for (i=0; i<n; i++)
	{
		temp <<= (p + i);
		x ^= temp;
	//使得temp重置为1,不能少
		temp = 1;
	}
	return x;
}
int main(void)
{
	unsigned int x = 0b00010001;
	printf("转换后:%x.\n", intvert(x, 4, 3));
	return 0;
}

3、下面这段代码是把中英文混合字符串(汉字用两个字节表示,特点是第一个字节的最高位是1)中的大写字母转化为小写字母,找出其中的bug。

for (char *piterator=sz_word; *piterator!=0; piterator++)

{

if (*piterator & 0x80 != 0)

{

piterator++;

}

else if (*piterator>='A' && *piterator<='Z')

piterator += 32;

}

以下是摘来的分析:(还没搞明白,先看完指针相关知识了回头再想想)

for (unsigned char *piterator = szWord; *piterator != '\0'; piterator++)
{
    if ((*piterator >= 'A') && (*piterator <= 'Z')) {
        //如果是大写字母
        *piterator += 32;
    }else if ((*piterator & 0x80)){
        
        if (*(piterator+1) == '\0') {
            //if the second character is null character
        }else {
            ++piterator;
        }
    }
}
/*
代码的分析:
1.我使用unsigned char来替换char。
2.对于汉字字符,我们只知道它的第一个字符的特征,我们却不知道第二个字符的特征,这样就存在一些特殊的情况:
	2.1 汉字的第二个字符是'\0'。我们有可能把这个字符看作是整个字符串的结束字符,也就是字符串的最后的一个字符。这时候如果我们试图跳过这个字符去获取它后面的字符,就会发生字符串的"越界"错误。为了避免这样的错误,如果汉字的第二个字符是'\0',就不跳过这个字符。
	2.2 汉字的第二个字符是英文的大写字母。在原先的代码中如果检测到某个字符是汉字字符的第一个字符,会将指针调整到这个汉字字符的第二个字节,接着又判断这个字节是否是大写字母,这时候就有可能将这个字符看作是大写字母,这样就发生了错误。为了避免这样的错误,我将判断是否是大小字母的代码放到前面。
3.另外的一个错误就是,由于"!="的优先级大于"&"的优先级,原先的代码:
*piterator & 0x80 != 0
被编译器解析成:
(*piterator) & (0x80 != 0)
这样出来的结果就是错误的。为了避免这样的错误,我删除了"不等于0"的比较。

*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值