提取字符串,并对字符串按字典序排序

来源:互联网 发布:java 学生成绩管理系统 编辑:程序博客网 时间:2024/05/16 18:19

问题:

从标准输入读入任意多个字符串,字符串用#分割。最后输入一个固定的标识输入结束的字符串,如“;/*.”,对输入的所有字符串按字典序排序,并输出到一个文件中。同时统计出字符串个数、最长字符串、最短字符串。

 

测试字符串如: qwer#uoy iiu89;#yuiji799#yuiojs;pp#dgfdb#abc;/*.

 

 

==============================================

 

#include <iostream>
#include <fstream>
#include <vector>

const int N = 1000;
using namespace std;

struct struct_str
{
 char* ch;
 int length;
};

int strDeal(char* str,std::vector<struct_str>& strvector)
{
 int n = 0;
 int count = 0;  //统计字符串的个数
 //先找到结束的位置
 while(str[n] != '/0')
 {
  if((str[n]==';') && (str[n+1]=='//') && (str[n+2]=='*') && (str[n+3]=='.'))
   break;
  n++;
 }
 int i,j;        //i指向首,j指向尾
 if(str[0]!='#') //首字符不是'#'
  i = j = 0;
 else            //首字符是'#'
  i = j = 1;
 int p=0;
 p++;
 while(j<n)
 {
  if(str[j]!='#' && j != n-1)
   j++;
  else
  {
   char *temp = new char[N];
   int k;int p=0;
   if(str[n-1]!='#' && j == n-1)
   {
    for(k=i;k<=j;k++)
     temp[p++] = str[k];
   }
   else
   {
    for(k=i;k<j;k++)
     temp[p++] = str[k];
   }
   temp[p] = '/0';
   struct_str tempStr;
   tempStr.length = j-i;
   tempStr.ch = temp;
   strvector.push_back(tempStr);
   count++;
   j++;
   i = j;
  }
 }
 return count;
}

void strCmp(std::vector<struct_str>& strvector)
{
 int countN = strvector.size();
 int *a = new int[countN];
 for(int i=0;i<countN;i++)
  a[i] = i;
 std::vector<struct_str>::iterator iter;
 int i,k,j,t;
 //选择排序
 for(i=0;i<countN-1;i++)
 {
  k = i;
  for(j=i+1;j<countN;j++)
   if(strcmp(strvector[a[j]].ch,strvector[a[k]].ch)<0)
    k = j;
  t = a[k];
  a[k] = a[i];
  a[i] = t;
 }
 int minB,maxB;
 maxB = minB = 0;
 for(i=1;i<countN;i++)
 {
  if(strvector[i].length<strvector[minB].length)
   minB = i;
  if(strvector[i].length>strvector[maxB].length)
   maxB = i;
 }
 cout<<"最短的字符是:"<<strvector[minB].ch<<endl;
 cout<<"最长的字符是:"<<strvector[maxB].ch<<endl;
 cout<<"字符串进行排序后的结果见文件'result.txt'!"<<endl;
 ofstream out("result.txt",ios::out);
 if(!out)
 {
  cerr<<"Open file error!";
  exit(1);
 }
 for(i=0;i<countN;i++)
  out<<strvector[a[i]].ch<<endl;
}

int main()

 std::vector<struct_str> strVector;
 char *str = new char[N];
 cout<<"Input a string:"<<endl;

 //cin>>str;            //遇到空格就会终止读入
 gets_s(str,N);         //或者用gets(str);
 int count = strDeal(str,strVector);
 std::vector<struct_str>::iterator iter;
 for(iter=strVector.begin();iter!=strVector.end();++iter)
  cout<<iter->ch<<endl;
 cout<<"个数是:"<<count<<endl;
 if(count)
  strCmp(strVector);
 else
  cout<<"不存在字符串!"<<endl;
}

 

 

====================

运行结果:

 

 

 

(法二)  使用string.h的库函数 :strstr()  和 strtok()

 

 

#include <string>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

const int N = 1000;

struct STring
{
 char *str;
 int length;
};

void StrDeal(std::vector<STring> &strTemp)
{
 int count = (int)strTemp.size();
 int i,j;
 int *a = new int[count];
    for(i=0;i<count;i++)
  a[i] = i;
 int min;
 for(i=0;i<count-1;i++)
 {
  min = i;
  for(j=i+1;j<count;j++)
  {
   if(strcmp(strTemp[a[j]].str,strTemp[a[min]].str)<0)
    min = j;
  }
  if(i != min)
  {
   int temp = a[min];
   a[min] = a[i];
   a[i] = temp;
  }
 }
 ofstream out("result.txt",ios::out);
 if(!out)
 {
  cerr<<"Open file Error!"<<endl;
  exit(1);
 }
 int Max ,Min;
 Min = Max = 0;
 for(i=0;i<count;i++)
 {
  if(strTemp[i].length<strTemp[Min].length)
   Min = i;
  else if(strTemp[i].length>strTemp[Max].length)
   Max = i;
 }
 out<<"Total number is:"<<count<<endl;
 out<<"Longest string is:"<<strTemp[Max].str<<endl;
 out<<"Shortest string is:"<<strTemp[Min].str<<endl;
 for(i=0;i<count;i++)
  out<<strTemp[a[i]].str<<" :"<<strTemp[a[i]].length<<endl;
}

int main()
{
 std::vector<STring> strChar;
 char str[N];
 char *delime = "#";
 cin.getline(str,N);
 char *temp = strstr(str,"/*.");
 int i = int(temp-str);
 int j = 0;
 char *p = new char[i];
 for(int k=0;k<i-1;k++)
  p[k] = str[k];
 p[i-2] = '/0';
 char* token = strtok(p,delime); 
 while(token != NULL)
 {
  STring strTemp;
  strTemp.str = token;
  strTemp.length = strlen(token);
  strChar.push_back(strTemp);
  token = strtok( NULL, delime );
 }
 StrDeal(strChar);
 return 0;
}