C++サンプル集

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

0013.空白の除去

ソース紹介

CPPファイルに記述
#include <iostream>
#include <cstdio>
using namespace std;

/*
sからcをすべて取り除く
*/
void squeeze(char s[], int c) {
    int i, j;
    for (i = j = 0; s[i] != '\0'; i++) {
        if (s[i] != c) {
            s[j++] = s[i];
        }
    }
    s[j] = '\0';
}

//sに行を入れ、長さを返す
//修正版
int getline(char s[], int lim) {
    char c = '\n';
    int i;
    for (i = 0; i < lim - 1 && (c = cin.get()) != EOF && c != '\n'; ++i) {
        s[i] = c;
    }
    if (c == '\n') {
        s[i++] = c;
    }
    s[i] = '\0';
    return i;
}


#define MAXLINE 1000
char line[MAXLINE];

/*
空白を除去するテスト
*/
int main()
{
    int len;
    while ((len = getline(line, MAXLINE)) > 0) {
        squeeze(line, ' ');
        cout << line;
    }
    return 0;
}
出力
hello world
helloworld
My Name is Taro
MyNameisTaro
^Z

サンプル説明

 まずC++のstringを使わない方法での記述を紹介します。
 この記述はK&Rにおけるgetchar()呼び出しcin.get()に置き換えた程度です。
 このサンプルは++演算子の説明で出てくるので、squeeze()関数の記述は重要です。
 squeeze()関数forループ内のif文
        if (s[i] != c) {
            s[j++] = s[i];
        }
 は
        if (s[i] != c) {
            s[j] = s[i];
            j++;
        }
 と書くのと同じことです。j++後置インクリメントですから、代入が終わった後インクリメントされます。
 空白を除去という機能のみ実装するのであれば、stringを使って以下のように書けます。

ソース紹介

CPPファイルに記述
#include <iostream>
#include <string>
using namespace std;

/*
空白を除去する
*/
int main()
{
    string str;
    while (getline(cin, str)) {
        size_t c;
        while ((c = str.find_first_of(" ")) != string::npos) {
            str.erase(c, 1);
        }
        cout << str << endl;
    }
    return 0;
}

K&Rでの記述

 元になったのは第2章:データ型・演算子・式に記述されています。インクリメントとデクリメント演算子の説明のところです。