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 