ACM小練習之字串的處理
阿新 • • 發佈:2019-02-19
題目描述:
輸入一行字串,要求按下三個條件處理:
①.若連續多個空格則都縮減為一個。
②.每個單詞第一個字母均大寫。
③.數字與字母相連時加下劃線(_)。
思路:
做這道題,先要選能讀取空格的輸入流,顯然cin不可以,C++的getline和C的gets都可以用,
然後我先把字串放在一個字元陣列中,再用for迴圈一個一個呼叫,
每讀取一個字元時,都要看看之前讀取的字元是空格,數字還是字母,
然後再根據不同情況,將不同字元存到輸出的字元陣列中,
最後輸出 輸出的字元陣列 即可。
原始碼:
#include <iostream> #include <stdio.h> // 用到gets函式,需要用這個 using namespace std; int main() { char a[1000],b[1000]; //設定兩個字串陣列,一個用來存輸入的,另一個用來存輸出的。 int i,j; bool kg,zm,sz; //讀取的變數 空格,字母,數字 // gets(a); //讀取所輸入的字串:gets,getline 均可,用gets需要stdio標頭檔案 cin.getline(a,1000); // PS:getline 用法: cin.getline(char a,int b,char c) // :a為所需存進的字元陣列,b為讀取的個數,c為讀到某個字元就停止,如果不填c,就預設讀到回車。 j=0; kg=false,zm=false,sz=false; //剛開始均設定為false for(i=0;a[i]!='\0';i++) //開始讀取字元 { if(a[i]==' ') //如果讀取的是空格,判斷之前的讀取是否為空格 { if(kg==1) continue; else if(kg==0) { b[j]=' '; j++; kg=1; } sz=0; zm=0; } else if(a[i]>='0'&&a[i]<='9') // 如果讀取的為數字 { if(zm==1) { b[j]='_'; b[++j]=a[i]; j++; zm=0; sz=1; } else { b[j]=a[i]; j++; sz=1; } kg=0; zm=0; } else if(a[i]>='a'&&a[i]<='z') //如果讀取的為字母 { if(i==0) { b[j]=char(a[i]-32); j++; zm=1; continue; } if(kg==1) { b[j]=char(a[i]-32); j++; kg=0; sz=0; zm=1; continue; } if(sz==1) { b[j]='_'; b[++j]=a[i]; j++; sz=0; zm=1; } else { b[j]=a[i]; j++; zm=1; } kg=0; sz=0; } } b[j]='\0'; // 結束字串 cout<<b<<endl; return 0; }
執行效果圖: