藍橋杯-串的處理

kewlgrl發表於2017-01-13

串的處理

在實際的開發工作中,對字串的處理是最常見的程式設計任務。本題目即是要求程式對使用者輸入的串進行處理。具體規則如下:
1. 把每個單詞的首字母變為大寫。
2. 把數字與字母之間用下劃線字元(_)分開,使得更清晰
3. 把單詞中間有多個空格的調整為1個空格。


例如:
使用者輸入:
you and     me what  cpp2005program
則程式輸出:
You And Me What Cpp_2005_program


使用者輸入:
this is     a      99cat
則程式輸出:
This Is A 99_cat


我們假設:使用者輸入的串中只有小寫字母,空格和數字,不含其它的字母或符號。每個單詞間由1個或多個空格分隔。
假設使用者輸入的串長度不超過200個字元。


解題思路:

先一次性讀取原始串,用一個新的串表示處理過原始串後的字串。

按照空格將原始串分割成子串,再按照轉換規則分別處理子串,將處理後的子串新增到新的串中。


#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char s[200],ss[200],str[200];//原始讀入串、按空格分離的子串、原始串按要求處理後的串
int k=0;
bool isLatter(char c)//字母判斷
{
    if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
        return true;
    else return false;
}
bool isNumber(char c)//數字判斷
{
    if(c>='0'&&c<='9')
        return true;
    else return false;
}

void solve(char ss[])//處理串
{
    for(int i=0; i<strlen(ss); ++i)
    {
        if(isLatter(ss[i]))//是字母
        {
            if(isNumber(ss[i-1])) str[k++]='_';//字母前面是數字要先加下劃線
            if(i==0) str[k++]= toupper(ss[i]);//首字母大寫
            else str[k++]=ss[i];
        }
        else if(isNumber(ss[i]))//是數字
        {
            if(isLatter(ss[i-1])) str[k++]='_';//數字前面是數字要先加下劃線
            str[k++]=ss[i];
        }
    }
}

int main()
{
    gets(s);//讀取含空格的整個串
    int j=0;
    bool flag=true;//標識是否處理過當前串
    for(int i=0; i<strlen(s); ++i)
    {
        if(int(s[i])!=32)//不是空格
        {
            flag=true;
            ss[j++]=s[i];//當前字元加到串中
            if(i==strlen(s)-1) solve(ss);//到達串尾,處理當前串
        }
        else
        {
            if(flag)
            {
                flag=false;
                solve(ss);//處理當前串
                str[k++]=' ';//一個空格分隔
                memset(ss,'\0',sizeof(ss));//清空字元陣列
            }
            j=0;
        }
    }
    cout<<str<<endl;
    return 0;
}
/*
you and     me what  cpp2005program
this is     a      99cat
*/