Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4828679
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-06 12:22:42

已知一个字串由GBK汉字和ansi编码的数字字母混合组成,编写c语言函数实现从中去掉所有ansi编码的字母和数字(包括大小写),要求在原字串上返回结果。
函数接口为:int filter_ansi(char* gbk_string)
注:汉字的GBK编码范围是0x8140-0xFEFE
 
我这里没有区别编码的问题,汉字就是占两个字节,并且最高位为1
 

#include <stdio.h>
#include <stdlib.h>

int isnum(int ch)
{
  if(ch>='0' && ch<='9')
   return 1;
  else
   return 0;
}

int iszimu(int ch)
{
  if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
    return 1;
  else
   return 0;
}

int filter_ansi(char* gbk_string)
{
  int i = 0;
  int filter = 0;
  char* tmp = gbk_string;
  while(*tmp)
  {
    if(isnum(*tmp) || iszimu(*tmp))
     {
       filter++;
       tmp++;
      }
    else if(*tmp&0x80)
      {
       gbk_string[i] = *tmp;
       i++;
       tmp++;
       gbk_string[i] = *tmp;
       i++;
       tmp++;
      }
     else
      tmp++;
  }
  gbk_string[i] = '\0';
  return filter;
}
 
int main(int argc, char *argv[])
{
  char gbk_string[] = "a1我b2是c3A谁";
  printf("original str is %s\n", gbk_string);
  printf("filter %d chars\n", filter_ansi(gbk_string));
  printf("after the str is:%s\n", gbk_string);
  system("PAUSE");    
  return 0;
}

阅读(2074) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-08-11 09:57:24

*tmp&0x80 是为了确定*tmp最高位是否为1

chinaunix网友2009-08-11 09:41:36

这是个编码问题,你可以查看下 编码名称 第一字节 第二字节 gb2312 0xB0-0xF7 0xA0-0xFE GBK 0x81-0xFE 0x40-0xFE BIG5 0x81-0xFE 0x40-0x7E or 0xA1--xFE 我这里简单起见,就直接用第一个字节的高位为1了.... 如果没记错的话,全角输入的汉字,符号都是高位为1。如这里的(,。)

chinaunix网友2009-08-11 09:17:44

请问博主,为什么是*tmp&0x80, 能解释一下吗?