C 言語での文字列をトリミングする
この記事では、C 言語で文字列をトリミングする方法をいくつか解説します。
カスタム関数を使って C 言語で文字列をトリミングする
文字列のトリミング関数は、標準の C ライブラリの文字列ユーティリティには含まれておらず、また POSIX に準拠した関数でも提供されていないため、自分で機能を実装する必要があります。この例では、char
ポインタの引数を 1つ取り、トリミングされた文字列へのポインタを返す trimString
という名前の関数を実装します。呼び出し元である私たちは、変更可能な文字列を渡す責任があることに注意してください。今回は str1
を複製するために strdup
を用いたが、文字列を使用する場合は free
コールを用いて解放する必要があります。
関数 trimString
は、文字列を 1 文字ずつ繰り返し処理するように実装されており、与えられた 1 文字がスペースである間はポインタを 1つインクリメントするようになっています。要するに、この while
ループは char
ポインタをスペース以外の最初の文字に移動させ、文字列の接頭辞をトリミングします。次に、インクリメントされたポインタの値が null に等しいかどうかがチェックされ、与えられた文字列にノンスペース文字がなかったことを意味します。その後の while
ループでは、文字列の末尾へのポインタを 1つずつ後方に移動させることで、文字列の末尾にあるスペースを削除します。ループがスペース以外の文字に遭遇するとループは停止し、次の文では文字列の最後に 0
を挿入します。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *trimString(char *str) {
char *end;
while (isspace((unsigned char)*str)) str++;
if (*str == 0) return str;
end = str + strlen(str) - 1;
while (end > str && isspace((unsigned char)*end)) end--;
end[1] = '\0';
return str;
}
int main(void) {
const char *str1 = " temporary string ";
printf("%s\n", str1);
char *tmp = strdup(str1);
printf("%s\n", trimString(tmp));
free(tmp);
exit(EXIT_SUCCESS);
}
出力:
temporary string
temporary string
別のカスタム関数を使って C 言語で文字列をトリミングする
先ほどのトリミング関数と同様に、文字列の両側からスペースを削除するために trimString2
が実装されています。最初の while
ループは文字列の末尾にあるスペースの数を計算し、2 番目のループは最初のスペース以外の文字へのポインタを移動させます。ループ文の最後には、len
に関数 strndup
で生成された文字列の文字数が格納されます。メモリリークを避けるために、strndup
関数から返されるポインタは呼び出し側で空にしておくべきであることに注意してください。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *trimString2(char *str) {
size_t len = strlen(str);
while (isspace(str[len - 1])) --len;
while (*str && isspace(*str)) ++str, --len;
return strndup(str, len);
}
int main(void) {
char *str2 = " temporary string ";
printf("%s\n", str2);
char *s = trimString2(str2);
printf("%s\n", s);
free(s);
exit(EXIT_SUCCESS);
}
出力:
temporary string
temporary string