【第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章:データ型・演算子・式に記述されています。
インクリメントとデクリメント演算子の説明のところです。