寻找字符串中第一个未重复的字符
2015-08-13 11:10
281 查看
设想这样一个场景,有一天你黑进去一个Server,获取的是普通用户权限,但是你在普通用户根目录下发现一个README文件,上面写着要获取server的管理员口令,在当前用户的根文件目录下有个文件,获取文件每一行第一个未重复的字符,一共有20行,最后这20个字符组成的就是这个系统的根口令。这里需要注意的是,口令中不能含有控制符号与空格符号,所以需要对文件进行过滤。
分析这个问题后,我们需要进行两步,一步是过滤,一步是统计每行字符出现的频数,并且把第一个为1的字符打印出来。
空格以及控制字符占用了ASCII表前32个,所以我们需要过滤掉这前32个。
所以有下面代码,处理完每一行将结果存入tmp数组中:
为了模拟各种文件,我们需要手动输入内容到文件,然后再读入在进行处理。
分析这个问题后,我们需要进行两步,一步是过滤,一步是统计每行字符出现的频数,并且把第一个为1的字符打印出来。
空格以及控制字符占用了ASCII表前32个,所以我们需要过滤掉这前32个。
所以有下面代码,处理完每一行将结果存入tmp数组中:
void inputcheck(char str[],char tmp[]) { int i=0,j=0; while(str[i]!='\0') { if(str[i] >= 0x21 && str[i] <= 0x7f) { tmp[j++]=str[i]; } i++; } }然后需要对处理过的每行字符串进行统计,算法的思路很简单,口令里面使用到的字符从ASCII的33开始到127结束,总共有96个字符,所以我们建立一个大小为96的频数数组存储每个字符出现的频数,然后从字符串的顺序开始寻找频数数组里面为一的第一个字符,所以有下面的代码:
void find(char str[]) { int i=0; int alphabet[96]={0}; int index=0; while(str[i]!='\0') { index=str[i]-33; alphabet[index]++; i++; } i=0; while(str[i]!='\0') { index=str[i]-33; if(alphabet[index]==1) { printf("%c\n",index+33); break; } i++; } }打开文件的时候,有个小问题忘记掉了,fopen的时候,w+与w虽然都是以可写的形式打开文件,但是打开后会将文件清空为0。
为了模拟各种文件,我们需要手动输入内容到文件,然后再读入在进行处理。
int main() { int T,n=0,len=0; FILE *fpw,*fpr; char buffer[2048]={0},str[2048]={0},processor[2048]={0}; printf("please input the data of lines,T<=20:\n"); scanf("%d",&T); if(T>20) { printf("lines data not ok\n"); return 0; } else { /*清空文件*/ fpw=fopen("./str.txt","w+"); fclose(fpw); /*追加方式打开文件*/ fpw=fopen("./str.txt","a"); if(fpw==NULL) printf("no file\n"); fflush(stdin); while(n<T) { scanf("%[^\n]",buffer); fflush(stdin); fprintf(fpw,"%s\n",buffer); ++n; } fclose(fpw); /*读文件*/ fpr=fopen("./str.txt","r"); if(fpr==NULL) printf("no file!!"); while(fgets(str,2048,fpr)!=NULL) { len=strlen(str); str[len]='\0'; inputcheck(str,processor); printf("after filter:\n%s\n",processor); find(processor); memset(processor,0,sizeof(processor)); } fclose(fpr); } }
相关文章推荐
- 日经社説 20150813 企業は強い成長基盤を築け
- php中static静态类与static 静态变量用法区别
- 九度 Online Judge 算法 刷题 题目1051:数字阶梯求和
- poj3111 二分最大化平均值
- BestCoder Round #50 (div.2)(hdu 5364,hdu 5365,hdu 5366)
- 设计模式:12 外观模式
- Linux常用命令
- WEB服务配置
- BZOJ 3669 [Noi2014]魔法森林 LCT
- Linux常用的命令
- 做一个温婉/儒雅的女汉子程序媛
- 《Objective-C基础教程》第7章 深入了解Xcode
- Android JNI Lame编解码实现wav到MP3的转换
- 使用asyncsocket群聊
- 粒子滤波Matlab代码
- Kafka项目实战-用户日志上报实时统计之应用概述
- Android AIDL使用步骤
- 我学正则表达式(2)——{m,n},?,*,+
- oracle10g启动报错ora-00214
- Google推荐的图片加载库Glide介绍