免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4077 | 回复: 14

2012华为杯 西南赛区 初试第三题 [复制链接]

论坛徽章:
0
发表于 2012-05-23 23:46 |显示全部楼层
本帖最后由 时间看来 于 2012-05-23 23:47 编辑

第三题:通配符应用,请从给定字符串中找出匹配的单词,*表示多个字符匹配,?表一个字符匹配。(大意如此,记不清函数接口了。只给了这2个库文件)
把自己的代码帖出来……

问题:
1.该怎么分析这个问题呢?可以给个大概思路吗?
我的分析是:有这几种勉强的组合~
*word_ptr: (字母)  ( \0  空格)   (如果要考虑标点符号的话)
*key_ptr:    (?)    (*\0)     (*字母)   (字母)

2.在Linux内核的操作系统上,GDB是否是调试程序的一个好的选择?因为我花了很多时间,感觉不太方便。KDbg好点~

  1.     /*
  2.      *还存在很多bug,但是基本像个样子了。花了很多时间~,特别是用GDB调试。GDB?说什么好呢……
  3.      */
  4.     #include <stdio.h>
  5.     #include <stdlib.h>

  6.     int get_word(const char *word_start);
  7.     void print_word_info(char *word, int len);

  8.     int
  9.     main(int argc, char *argv[])
  10.     {
  11.         int len;
  12.         char source_str[] = "This wil wel is great. I will make it.";
  13.         char *aim_str = "i?";
  14.         my_match(source_str, aim_str);
  15.         return 0;
  16.     }

  17.     /*
  18.      *匹配函数
  19.      */
  20.     void
  21.     my_match(const char *input_str, const char *input_key)
  22.     {
  23.         
  24.         char *word_start;
  25.         char *word_ptr, *key_ptr;
  26.         int word_len,key_len;
  27.         int flag = 0;
  28.         
  29.         word_start = input_str;
  30.         key_ptr = input_key;
  31.         word_ptr = word_start;
  32.         word_len = get_word(word_start);
  33.         key_len = get_word(key_ptr);

  34.         do{
  35.             if(*word_ptr != ' ' && *word_ptr != '\0' \
  36.                 && *word_ptr != ',' && *word_ptr != '.'){
  37.                 if(*key_ptr == '*' && *(key_ptr+1) =='\0'){
  38.                     word_ptr++;
  39.                     flag = 1;
  40.                     print_word_info(word_start, word_len);
  41.                 }else if(*key_ptr == '*' && *(key_ptr+1) !='\0'){
  42.                     if(*word_ptr == *(key_ptr+1)){
  43.                         key_ptr += 2;
  44.                         word_ptr++;
  45.                     }else{
  46.                         word_ptr++;
  47.                     }
  48.                 }else if(*key_ptr == '?'){
  49.                     key_ptr++;
  50.                     word_ptr++;
  51.                 }else if(*key_ptr == *word_ptr){
  52.                     key_ptr++;
  53.                     word_ptr++;
  54.                 }else{
  55.                     flag = 1;
  56.                 }
  57.             }else if(*key_ptr == '*' && *(key_ptr+1) == '\0' || *key_ptr == '\0'){
  58.                 flag = 1;
  59.                 print_word_info(word_start, word_len);
  60.             }else{
  61.                 flag = 1;
  62.             }
  63.             
  64.             if(flag){
  65.                 key_ptr = input_key;
  66.                 word_start += (word_len + 1);
  67.                 word_ptr = word_start;
  68.                 word_len = get_word(word_start);
  69.                 flag = 0;
  70.             }
  71.         }while(*(word_start - 1) != '\0');
  72.         
  73.     }

  74.     /*
  75.      *得到一个单词末尾位置(from 1)
  76.      */
  77.     int
  78.     get_word(const char *word_start)
  79.     {
  80.         int i;
  81.         char c;
  82.         for(i = 0; (word_start[i] != '\0') && (word_start[i] != ' '); i++)
  83.         ;
  84.         return i;
  85.     }

  86.     /*
  87.      *输出位置和匹配的单词
  88.      */
  89.     void
  90.     print_word_info(char *word, int len)
  91.     {
  92.         int i;
  93.         for(i = 0; i < len; i++){
  94.             putchar(word[i]);
  95.         }
  96.         printf(" ");
  97.     }
复制代码
http://blog.chinaunix.net/uid-25194149-id-3184638.html

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
发表于 2012-05-24 08:41 |显示全部楼层
路过,好奇问一下,像

int
main(int argc, char *argv[])

这种代码风格叫什么名字?类型单独一行有什么深意?

论坛徽章:
0
发表于 2012-05-24 09:21 |显示全部楼层
回复 2# bruceteen


叫什么风格,我不知道。我应该是在《C和指针》中看到的这种写法。见其“2.3 程序风格”。
至于为什么的话,作者认为“在函数的定义中,返回类型出现于独立的一行中,而函数的名字则在下一行的起始处。这样在寻找函数的定义时,你可以在一行的开始处找到函数的名字。”
我觉得,函数的返回类型也很突出。这不错吖,就这么写啦。

论坛徽章:
0
发表于 2012-05-24 09:30 |显示全部楼层
时间看来 发表于 2012-05-24 09:21
回复 2# bruceteen


这个也有一定道理哈,在vi编辑器中搜索也能快速定位到函数名而不是返回值类型。

论坛徽章:
0
发表于 2012-05-24 09:34 |显示全部楼层
将单词建成trie,然后用表达式在trie上面深度优先搜索。

论坛徽章:
0
发表于 2012-05-24 09:50 |显示全部楼层
bruceteen 发表于 2012-05-24 08:41
路过,好奇问一下,像

int

from GNU Coding Standards

论坛徽章:
0
发表于 2012-05-24 09:52 |显示全部楼层
本帖最后由 时间看来 于 2012-05-24 10:02 编辑

回复 5# _Rayx


将一个单词建成tree?还是将所有单词建成tree?
如何匹配呢?我算法基本功不行啊,不理解~

论坛徽章:
0
发表于 2012-05-24 10:03 |显示全部楼层
回复 2# bruceteen


应该是这个
http://en.wikipedia.org/wiki/Indent_style#GNU_style

论坛徽章:
0
发表于 2012-05-24 10:06 |显示全部楼层
回复 6# hbmhalley


哦,不错~

论坛徽章:
0
发表于 2012-05-24 10:13 |显示全部楼层
sacry 发表于 2012-05-24 10:03
回复 2# bruceteen



原来有这么多style!
看来我是函数的定义是GNU style,内部是K&R style喽,这样好吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP