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