C++サンプル集

【第1部】C言語(K&R検証)編

0022.後ろ側の空白、タブ、改行を除去する

ソース紹介

 ある文字列があり、その意味のある文字から後ろを切り詰める処理はよく使われます。
CPPファイルに記述
#include <iostream>
#include <cstdio>
using namespace std;


/*
strlen: sの長さを返す
*/
int strlen(char s[]) {
    int i{};
    while (s[i] != '\0') {
        ++i;
    }
    return i;
}

/*
後ろ側の空白、タブ、改行を除去する
*/
int trim(char s[]) {
    int n;
    for (n = strlen(s) - 1; n >= 0; n--) {
        if (s[n] != ' ' && s[n] != '\t' && s[n] != '\n') {
            break;
        }
    }
    s[n + 1] = '\0';
    return n;
}

/*
trimのテスト
*/
int main()
{
    //後ろに空白などがある文字列
    char str[] = "hello world      \n   \t";
    int n = trim(str);
    cout << "str[" << n << "]の後ろは読み飛ばした。" << endl;
    cout << str << endl;
    return 0;
}
出力
str[10]の後ろは読み飛ばした。
hello world

サンプル説明

 このサンプルには0009.文字列の長さを調べるで紹介したstrlen()関数が使われています。
 ループは文字列の後ろからスキャンして空白など以外が出てきたときにbreakします。その後、、その位置に'\0'を入れて位置を返します。
 C++で書くときは、stringfind_first_not_of()、find_last_not_of()、substr()関数を使用します。(stringにはtrim()関数なないので)自作します。

ソース紹介

CPPファイルに記述
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
/*
指定された文字セットを前後から除去
*/
string trim(string& str,string& check)
{
    string ret{""};
    auto left = str.find_first_not_of(check);
    if (left == string::npos) {
        return ret;
    }
    auto right = str.find_last_not_of(check);
    ret = str.substr(left, right - left + 1);
    return ret;
}

/*
trimのテスト
*/
int main()
{
    //前後に空白などがある文字列
    string str = "     hello world      \t";
    cout << '[' << str << ']' << endl;
    string chk = " \r\n\t";
    str = trim(str,chk);
    cout << '[' << str << ']' << endl;
    return 0;
}
出力
[     hello world       ]
[hello world]

サンプル説明

 この例では前後の空白などを除去しています。

K&Rでの記述

 元になったのは第3章:制御の流れに記述されています。Break文とContinue文の説明のところです。