免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kewenliang
打印 上一主题 下一主题

一道百度笔试题 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2008-10-21 18:35 |只看该作者

回复 #1 kewenliang 的帖子

印象中有些C语言的书中提到过。

a、b、c……, A,B,C……是对应到具体的ASCI字符集中有对应的编号的。通过编号来判断。

只是你读入字符的时候可能会碰到问题,因为你不知道下一个字符是中文的字符还是英文的字符。这个需要具体去试了。

论坛徽章:
0
72 [报告]
发表于 2008-10-30 20:02 |只看该作者
我是来学习的

论坛徽章:
0
73 [报告]
发表于 2008-11-01 01:04 |只看该作者
哪位大哥能把标准答案弄出来么

论坛徽章:
0
74 [报告]
发表于 2008-11-03 18:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
75 [报告]
发表于 2008-11-11 10:36 |只看该作者

我的方法

首先大致介绍下汉字编码:
      GB2312规定"对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示",习惯上称第一个字节为"高字节",第二个字节为"低字节"。GB2312的编码范围为2121H-777EH,与ASCII有重叠,通行方法是将GB码两个字节的最高位置1以示区别。GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。

      GBK是GB2312-80的扩展,是向上兼容的。它包含了20902个汉字,因为GBK和GB18030的低字节最高位都可能不是1,其编码范围是0x8140-0xfefe,剔除高位0x80的字位。其所有字符都可以一对一映射到Unicode2.0。

      我觉得本题主要是为了防止将汉字编码的第二个字节当做字母将其小写(+32),否则直接逐个字节的tolower()就可以了,下面是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void m_lower(char *str)
{
        while(*str!='\0')
        {
                if(*str & 0x80)
                        str += 2;
                else
                {
                        *str = tolower(*str);
                        str++;
                }
        }
}
int main()
{
    char test[]="aB测试cD";
        m_lower(test);
        printf("string is %s\n",test);
        return 0;
}
/*
*run result:
*            string is ab测试cd
*/

论坛徽章:
0
76 [报告]
发表于 2008-11-11 10:50 |只看该作者

接上一个帖子

GB 2312-80其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;
比如 朱镕基的“镕”字在GB 2312-80里并没有收录,也就是说这个字的第二个字节不在0xa1-0xfe范围,有可能被当做字母。我们将判断
汉字的部分注释,直接tolower(),就会出现错误。

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

void m_lower(char *str)
{
        while(*str!='\0')
        {
//                if(*str & 0x80)
//                        str += 2;
//                else
//                {
                        *str = tolower(*str);
                        str++;
//                }
        }
}
int main()
{
    char test[]="aB测试镕cD";
        m_lower(test);
        printf("string is %s\n",test);
        return 0;
}
/*
*run result:
*            string is ab测试閒cd
*/

论坛徽章:
0
77 [报告]
发表于 2008-11-11 10:53 |只看该作者
static int strfunc(char *str, int mode, int c1, int c2)
{

  int ret;
  char *pt;
  int cnt;
  int from, to;

        if(str == NULL){
                return(-1);
        }
        if(strlen(str) == 0){
                return(0);
        }

        for(pt = str, cnt = 0 ; *pt != '\0' ; ){
                ret = mbtowc((wchar_t *)0, pt, MB_CUR_MAX);
                if(ret < 0){
                        break;
                }
                if(ret == 1){
                        from = (int)*pt;
                        if(mode == 1){
                                to = toupper(from);
                        }else if(mode == 2){
                                to = tolower(from);
                        }else if(mode == 3){
                                if(from == c1){
                                        to = c2;
                                }else{
                                        to = from;
                                }
                        }else{
                                to = from;
                        }
                        if(from != to){
                                cnt ++;
                                *pt = (char)to;
                        }
                }
                pt += ret;
        }

        if(*pt != '\0'){
                return(-1);
        }else{
                return(cnt);
        }

}        /*        strfunc()        */


mode:
1:小写变大写
2:大写变小写
3:c2变c1

给分,谢谢!

论坛徽章:
0
78 [报告]
发表于 2008-11-11 11:10 |只看该作者
Hi spiritX ~~

我测试了下你的函数,“镕”字没有被正确的处理,希望你能把你的思想讲一下,只有代码比较抽象。呵呵,谢谢

best wishes

论坛徽章:
0
79 [报告]
发表于 2008-11-11 12:45 |只看该作者
原帖由 north423 于 2008-11-11 11:10 发表
Hi spiritX ~~

我测试了下你的函数,“镕”字没有被正确的处理,希望你能把你的思想讲一下,只有代码比较抽象。呵呵,谢谢

best wishes


调用这个函数之前先setlocale(LC_ALL, "");一下 --中文系统
需要#include <locale.h>

论坛徽章:
0
80 [报告]
发表于 2008-12-24 21:05 |只看该作者
原帖由 aliking 于 2008-9-16 17:36 发表
不知道有什么要求。
用什么编程语言?输入字符串和输出字符串是不是同一个?

下面是用C实现的,输入和输出字符串用同一个。
void lower(char *s)
{
        while(*s != '\0')
        {
             ...


这个应该能行!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP