鱼C论坛

 找回密码
 立即注册
查看: 102|回复: 9

一道oj题的思路

[复制链接]
最佳答案
0 
发表于 3 天前 | 显示全部楼层 |阅读模式
10鱼币
这道题我样例过了,但是答案错误。我不知道会不会是我思路有问题。
题目描述
互联网中存在许多的不和谐词汇,在我们浏览互联网的时候,搜索引擎经常会出现提示信息“根据相关法律法规和政策,部分搜索结果未予显示”。小王同学也想制作一个自己的屏蔽词库,这样他就可以将自己不喜欢的词汇从文件中换成别的字符了。屏蔽词库是一个ASCII码文件,这个文件中只含有单词,每个单词占一行,每个单词中只可能有大小写字母与空格。题目中和谐词库的文件名为dict.dic。(屏蔽词库中每个词汇长度小于10,屏蔽词汇个数不超过10.)
你的任务是将输入中的所有和谐词库中的词语全部替换成“!@#$%^&*”(按住键盘shift和数字1至8),然后输出。这里要注意,如果一个词语中包含屏蔽词汇,那么只将屏蔽词汇替换,例如“hehasAAA”被处理后将得到“he!@#$%^&*AAA”,注意屏蔽词汇区分大小写,即aaa与AAA是两个不同的单词,为了使问题简化,屏蔽词汇中不会出现互相包含的情况,如“xabcx”与“abc”不会同时出现在同一个屏蔽词库中。由于小王同学很不擅长文件操作,所以他希望你能帮他制作这个屏蔽词汇程序。
输入
若干长度小于100的字符串。
输出
添加屏蔽词后的结果。
样例输入
  1. [/code]
  2. The night falls gently. And you are not here. I missing you more and more and I start getting worried as
  3. I stare at the door just waiting for you to surprise me with your arrival at any moment.
  4. Sweet delusion... you are so far away right now that all I can ask for is that time moves faster...

  5. 样例输出
  6. 如果屏蔽词库如下:
  7. is
  8. good
  9. are
  10. the
  11. ha ha
  12. some
  13. get
  14. has
  15. more
  16. bad
  17. 则输出:

  18. The night falls gently. And you !@#$%^&* not here. I m!@#$%^&*sing you !@#$%^&* and !@#$%^&* and I start !@#$%^&*ting worried as
  19. I st!@#$%^&* at !@#$%^&* door just waiting for you to surpr!@#$%^&*e me with your arrival at any moment.
  20. Sweet delusion... you !@#$%^&* so far away right now that all I can ask for !@#$%^&* that time moves faster...

  21. [code]#include<stdio.h>
  22. #include<string.h>
  23. void check(char *s,char *a);//屏蔽信息
  24. void print(char *a);//打印
  25. int main(void)
  26. {
  27.         char a[110];
  28.         while(gets(a))//循环输入
  29.         {
  30.             FILE *fp=fopen("dict.dic","r");
  31.             while(!feof(fp))
  32.            {
  33.                         char c=getc(fp);
  34.                         char s[11]={'0'};
  35.                         int i=0;
  36.                         while(c!='\n'&&c!=EOF)
  37.                        {
  38.                                    s[i]=c;
  39.                                    i++;  
  40.                                    c=getc(fp);//读取屏蔽词
  41.                     }
  42.                                check(s,a);
  43.             }
  44.         print(a);
  45.                 printf("\n");       
  46.         }
  47.         return 0;
  48. }
  49. void check(char *s,char *a)
  50. {
  51.         int x=strlen(s);
  52.         int y=strlen(a);
  53.         int i,j=0,k=0,r=0;
  54.         for(i=0;i<y;i++)
  55.         {
  56.                 if(a[i]==s[j])
  57.                 {
  58.                         k=i;
  59.                         r=j;
  60.                         while(k<y&&r<x&&a[k]==s[r])
  61.                          k++,r++;//判断是否一致       
  62.                 }
  63.                 if(r==x&&x!=1)
  64.                 {
  65.                         a[k-1]='!';
  66.                         for(int t=2;t<=x;t++)
  67.                             a[k-t]='?';//屏蔽信息
  68.                 }
  69.                 else if(r==x&&x==1)
  70.                     a[k-1]='!'; //屏蔽信息                            
  71.         }
  72.         return;
  73. }
  74. void print(char *a)
  75. {
  76.         int x=strlen(a);
  77.         for(int i=0;i<x;)
  78.         {
  79.           if(a[i]!='?'&&a[i]!='!')
  80.            {
  81.             printf("%c",a[i]);
  82.                 i++;                 
  83.            }
  84.           else if(a[i]=='?')
  85.            {
  86.             printf("!@#$%^&*");//打印屏蔽字符
  87.             while(a[i]=='?')
  88.                     i++;     
  89.                 }       
  90.            else
  91.            {
  92.             if(a[i-1]=='?'&&i>0)
  93.                     i++;
  94.                 else
  95.                     printf("!@#$%^&*"),i++;        //单个字母打印                
  96.            }       
  97.         }
  98.            return;
  99. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
733 
发表于 3 天前 | 显示全部楼层
你为什么不自己做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
733 
发表于 3 天前 | 显示全部楼层
好吧,你在自己写了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
733 
发表于 3 天前 | 显示全部楼层
给你个思路,先把dict.dic文件中的所有单词都读取出来,保存到数组
然后对字符串进行扫描,匹配到的单词进行替换,不匹配就输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 3 天前 | 显示全部楼层
人造人 发表于 2020-3-25 16:42
给你个思路,先把dict.dic文件中的所有单词都读取出来,保存到数组
然后对字符串进行扫描,匹配到的单词进 ...

我不就是这么做的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
3 
发表于 3 天前 | 显示全部楼层
strcmp 比较字符串
将关键字符串和输入字符串比较(可以百度在一串字符中搜索指定指定字符串)。如果有记录位置,替换。我想应该可以的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 3 天前 | 显示全部楼层
我现在想知道我这段代码具体错在哪里,如果错了,应该怎么改,毕竟每个人思路不同,太多了,不可能一个思路写一次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
3 
发表于 3 天前 | 显示全部楼层
给你个思路,你看看行不行!

  1. #include <stdio.h>
  2. #include <stddef.h>
  3. #include <string.h>

  4. int findstr(char *s,char *f,char *c);
  5. int main(void)
  6. {
  7.         char arr[1024]="dsafdsafdsafdasliowjhfo afhafdhfsdjadbs vbdkhdio;oagfeafselfopwfh";
  8.         char temp[10]="af";
  9.         char ch[10]="????????";
  10.         findstr(arr,temp,ch);
  11.     return 0;
  12. }
  13. //采用类似字符串拼接方式
  14. int findstr(char *s,char *f,char *c)
  15. {
  16.         //获取字符串长度
  17.         size_t s_len=strlen(s);
  18.         size_t f_len=strlen(f);
  19.         size_t c_len=strlen(c);
  20.        
  21.         if (s_len < f_len ) return -1;//如果输入字符串比约束字符串短就退出
  22.         register int i=0,j=0;
  23.         for (;i<s_len-f_len;i++)
  24.                 if ( ! strncmp(s+i,f,f_len) )
  25.                 {
  26.                         *(s+i)='\0';
  27.                         printf("%s%s",s+j,c);
  28.                         j=i+f_len;
  29.                         i=i+f_len-1;
  30.                 }
  31.         printf("%s",s+j);//打印剩余字符串或者原字符串;
  32.         return 0;
  33. }
复制代码
  1. ds????????ds????????ds????????dasliowjhfo ????????h????????dhfsdjadbs vbdkhdio;oagfe????????selfopwfh
  2. --------------------------------
  3. Process exited after 0.01573 seconds with return value 0
  4. 请按任意键继续. . .
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 3 天前 | 显示全部楼层
Cool_Breeze 发表于 2020-3-25 18:34
给你个思路,你看看行不行!

谢谢兄弟,但我其实还是想弄懂自己代码错在哪里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
发表于 昨天 18:35 | 显示全部楼层
Cool_Breeze 发表于 2020-3-25 17:12
strcmp 比较字符串
将关键字符串和输入字符串比较(可以百度在一串字符中搜索指定指定字符串)。如果有记录 ...

可不太行,还是得一个个字母循环,因为观察事例可以发现在在单词中间也可能存在敏感词
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-3-28 19:37

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表