【第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++で書くときは、
stringの
find_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文の説明のところです。