1. 程式人生 > >uva 10815 紫書vector應用例題

uva 10815 紫書vector應用例題

題目要求:

輸入文字 ,輸出文字中所有不同的單詞,注意字母及順序相同大小寫不同的單詞是同一個單詞,且標點符號不輸出。

程式碼:

#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<sstream>
#include<set>
using namespace std;

set<string> dict;

int main()
{
  string s,buf;
   while(cin>>s)
   {
       int i;
       for(i=0;i<s.length();i++)
         if(isalpha(s[i]))//判斷字元是否為字母
           s[i]=tolower(s[i]);//統一改為小寫字母
         else
            s[i]=' ';//若不是字母給為空格
       stringstream ss(s); //講s輸入給流ss
       while(ss>>buf) dict.insert(buf);//將流ss中的字串賦給buf。
   }
   for(set<string>::iterator it=dict.begin();it!=dict.end();++it) //set中宣告it“指標”的固定格式
      cout<< *it<<"\n";
    return 0;
}

分析:

1. stringstream ss(s);while(ss>>buf) 

(1)用法:從s中提取字串寫入buff中。

字串流是通過空格判斷一個字串的結束

(2)stringstream不會主動釋放記憶體(或許是為了提高效率),但如果你要在程式中用同一個流,反覆讀寫大量的資料,將會造成大量的記憶體消 耗,因些這時候,需要適時地清除一下緩衝 (用 stream.str("") )。

(3)getline的用法。getline(cin,line)    stringstream stream(line);   while(stream>>word){cout<<word<<endl;}

補充。

sprintf函式

int main(){
    char str[256] = { 0 };
    int data = 1024;
    //將data轉換為字串
    sprintf(str,"%d",data);
    //獲取data的十六進位制
    sprintf(str,"0x%X",data);
    //獲取data的八進位制
    sprintf(str,"0%o",data);
    const char *s1 = "Hello";
    const char *s2 = "World";
    //連線字串s1和s2
    sprintf(str,"%s %s",s1,s2);
    cout<<str<<endl; 
    return 0;
} 

sscanf函式

int main(){
    char s[15] = "123.432,432";
    int n;
    double f1;
    int f2;
    sscanf(s, "%lf,%d%n", &f1, &f2, &n);
    cout<<f1<<" "<<f2<<" "<<n;
    return 0;
}