[編程題]按字節截取字符串

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章