您的位置:首页 > 其它

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

2015-08-13 11:10 281 查看
设想这样一个场景,有一天你黑进去一个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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: