問題描述:
在給定字符串中找出單詞( “單詞”由大寫字母和小寫字母字符構成,其他非字母字符視爲單詞的間隔,如空格、問號、數字等等;另外單個字母不算單詞);找到單詞後,按照長度進行降序排序,(排序時如果長度相同,則按出現的順序進行排列),然後輸出到一個新的字符串中;如果某個單詞重複出現多次,則只輸出一次;如果整個輸入的字符串中沒有找到單詞,請輸出空串。輸出的單詞之間使用一個“空格”隔開,最後一個單詞後不加空格。
要求實現函數:
void my_word(charinput[], char output[])
【輸入】 char input[], 輸入的字符串
【輸出】 char output[],輸出的字符串
【返回】 無
示例
輸入:charinput[]="some local buses, some1234123drivers" ,
輸出:charoutput[]="drivers local buses some"
輸入:charinput[]="%A^123 t 3453i*()" ,
輸出:charoutput[]=""
以上摘自
http://blog.csdn.net/lanyan822/article/details/7983832 ,但是考慮到沒有給出這個的源代碼,自己隨手寫了一個,寫得不好,僅供娛樂,歡迎大神指點。
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int my_cmp(string &str1,string &str2)//比較函數
{
return str1.length() > str2.length();
}
void my_word(char input[],char output[])
{//考慮到存C代碼編程複雜,用C++實現算法
vector<string> wordList;//單詞鏈表
bool flag = true;//表示開始記錄單詞
string temp;//臨時單詞緩存
for(unsigned int i = 0;i < strlen(input);++i)//遍歷輸入 字符串,必要
{
if(input[i] == ' ' && !temp.length())//接收到空格表示開始記錄切單詞緩存爲空
{
flag = true;
continue;
}
if(flag)
{
if((input[i] >= 'a')&&(input[i] <= 'z') ||(input[i] >= 'A')&&(input[i] <= 'Z'))
{//如果接收到字母開始記錄
temp += input[i];
}
else if(input[i] == ' ')//一個單詞接受完成
{
if(temp.length() > 1 && find(wordList.begin(),wordList.end(),temp) == wordList.end())//單個字母不接受且保證不重複插入
{
wordList.push_back(temp);
}
temp.clear();
}
else//接收到其他字符丟棄
{
flag = false;
temp.clear();
}
}
}
sort(wordList.begin(),wordList.end(),my_cmp);//字符串長度降序排列
int placeFlag = 0;//記錄輸出字符串當前位置
for(unsigned int i = 0;i < wordList.size();++i)//必要轉換
{
strcpy(&output[placeFlag],((string)wordList.at(i)).c_str());
//memcpy(&output[placeFlag],((string)wordList.at(i)).c_str(),((string)wordList.at(i)).size());//這種方式對於大數據的情況下效率高很多,但是注意要在output字符串最後加上‘\0’結束符
placeFlag += ((string)wordList.at(i)).length();
if(i != wordList.size() - 1)//爲了滿足最後一個單詞不加空格
output[placeFlag++] = ' ';
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char getLin[1000];
my_word("abc ad a wer fdsaf7897 dfakdjfadfa*%$%^",getLin);
return 0;
}