Beginning to 编程

VC++ 方面编程文章

 

转换大小写C函数

 

Richard zeng  3/19/2006 10:50:36 AM

 

这几天又把以前的 C 课程翻了出来 , 因为自己对 C 的指针和数组不是很 DEV.

模拟 C 库函数中的转化大小写函数 .

 

// 转换成大写 , 函数参数为字符数组

// 利用字符串数组的结尾都是 \0

void ToUpper(chars[])

{

       int i=0;

       while(s[i++]!='\0' )

       {

              // 判断是否是小写字母

              if(s[i]>='a' && s[i]<='z' )

                     s[i] -= 32;     // 小写字母比大写字母的 ASCII 32

       }

}

 

// 转换成大写 , 函数参数为字符指针

void ToUpperPtr(char* s)

{

       while(*s != '\0')

       {

// 判断是否是小写字母

              if(*s >='a' && *s <='z')

                     *s -= 32;      // 小写字母比大写字母的 ASCII 32

              s++; // 指针的地址 ++

       }

}

posted on 2006-03-19 10:56 Beginning to 编程 阅读(5825) 评论(5)  编辑 收藏 引用 所属分类: 关键代码

评论

# re: 转换大小写C函数 2006-03-19 17:13 可冰

/**************************************/
// 利用字符串数组的结尾都是 \0
void ToUpper(chars[])
{
    int i=0;
    while(s[i++]!='\0' )
    {  ^^^^^
/**************************************/
你这个i自加的可不是时候啊

另外,其实只要一条语句就可实现转换的.
while( s[i] != '\0' )
  s[i++] &= 0xDF; // 11011111B
/*或者*/
while( *s != '\0' )
  *s++ &= 0xDF;  回复  更多评论   

# re: 转换大小写C函数 2006-03-19 17:19 可冰

还有一种代码密度更高的写法:
(但不推荐使用,可读性太差了!)
while( *s && *s++ &= 0xDF )
    ;
其实对于指针的话还应该加上一条判断:
while( s && *s && *s++ &= 0xDF )
    ;  回复  更多评论   

# re: 转换大小写C函数 2006-04-04 10:31 编程之道

为什么要和0xDF与?   回复  更多评论   

# re: 转换大小写C函数 2006-04-04 11:01 编程之道

大概明白了,写一下
a 0110 0001
A 0100 0001
只有第6位是不一样的,所以,如果想把小写转换成大写,只需要将第6位改成0,也就是-32。这样直接和
1101 1111
进行与操作,这样就保证了其他位不变,将第6位变成了0
同样,如果要将大写转换成小写,需要将第6为改为1。
直接和
0010 0000
进行或运算,就可以完成。
还有一个比较更简单的是直接和
0010 0000
进行异或运算,就ok了  回复  更多评论   

# re: 转换大小写C函数 2009-06-23 16:01 u2u

@可冰
这个有bug,如果字符串中包含数字呢?
我的实现:
while(*s && ((*s < 0x61 || *s > 0x7A) || (*s &= 0xDF)) && s++);  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

相册

BlogDev

搜索

最新评论

阅读排行榜

评论排行榜