寻找字符串中第一个未重复的字符

来源:互联网 发布:软件测试就业方向 编辑:程序博客网 时间:2024/05/22 04:49

设想这样一个场景,有一天你黑进去一个Server,获取的是普通用户权限,但是你在普通用户根目录下发现一个README文件,上面写着要获取server的管理员口令,在当前用户的根文件目录下有个文件,获取文件每一行第一个未重复的字符,一共有20行,最后这20个字符组成的就是这个系统的根口令。这里需要注意的是,口令中不能含有控制符号与空格符号,所以需要对文件进行过滤。

分析这个问题后,我们需要进行两步,一步是过滤,一步是统计每行字符出现的频数,并且把第一个为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);}}





0 0
原创粉丝点击