Talk is cheap, show me the code.
一、問題描述
編寫一個截取字符串的函數,輸入爲一個字符串和字節數,輸出爲按字節截取的字符串。但是要保證漢字不被截半個,如”我ABC”4,應該截爲”我AB”,輸入”我ABC漢DEF”6,應該輸出爲”我ABC”而不是”我ABC+漢的半個”。
輸入描述:
輸入待截取的字符串及長度
輸出描述:
截取後的字符串
輸入例子:
我ABC漢DEF
6
輸出例子:
我ABC
二、問題分析
按字節處理字符串,做題以來算比較新穎的題目。主要是判斷漢字與字母的區別。當截取到的一個字節如果符號位爲1那麼就是漢字,如果符號位爲0就是字母,這也是爲什麼ASCII碼錶只有 0-127 個字符的原因。C++的字符char就是一個字節的,所以string中的每個字符都是一個字節。可以按前面說的邏輯進行判斷區分漢字和字母,但其實沒有必要,因爲C++實現的流默認如果輸出的字節剛好是漢字的一半,則那半個字節默認就不輸出。用C++解這道題太簡單了。
解題方式1:
直接用C++默認流不輸出半個漢字字節。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
int n;
while (cin >> s >> n)
{
for (int i = 0; i < n; i++)
cout << s[i];
cout << endl;
}
return 0;
}
解題方式2:
用判斷字節是否不小於128來區分漢字字節和字母字節。
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
int N;
while(cin>>s>>N){
string ss;
if(s[N-1]>=128)//判斷尾字符是否是漢子的前一個字節
ss=s.substr(0,N-1);
else
ss=s.substr(0,N);
cout<<ss<<endl;
}
return 0;
}