C 言語での文字列をトリミングする

胡金庫 2023年10月12日
  1. カスタム関数を使って C 言語で文字列をトリミングする
  2. 別のカスタム関数を使って C 言語で文字列をトリミングする
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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C String