Thinkers'Studio
JavaとC言語の自習ツール
文字列の前後の空白を除去する trim関数の自作例
 trim は多くのプログラミング言語で用意されていますが、C言語にはありません。

自作のtrim関数

 ここでは、次の形式で自作します。
 void trim( char *s ) s の前後から空白を除去する

 空白かどうかは isspace関数で判定します。全角空白や文字列の途中にある空白は、除去しません。

trim 関数の自作サンプルプログラム 】
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void trim( char *s ) {
    int i, j;
 
    //文字列の最後から空白を読み飛ばして除外する
    for( i = strlen(s)-1; i >= 0 && isspace( s[i] ); i-- ) ;
    s[i+1] = '\0';
    //先頭から空白でない文字まで読み飛ばす
    for( i = 0; isspace( s[i] ); i++ ) ;
    //前方の空白を詰める
    if( i > 0 ) {
        j = 0;
        while( s[i] ) s[j++] = s[i++];
        s[j] = '\0';
    }
}

main()
{
    char str[][48] = { "", "   ", "A", " B ", "CD"
        , "   \tEFG  ", " A B C  DEF G   ", " 前後は全角空白 " };
    int i;

    for( i = 0; i < 8; i++ ) {
        trim( str[i] );
        printf( "#%s#\n", str[i] );
    }
}
実行結果はこうなります。
##
##
#A#
#B#
#CD#
#EFG#
#A B C  DEF G#
# 前後は全角空白 #

自作 trim の処理手順

後ろの空白の除去

 文字列の後ろの空白は、先頭から見て行くと、文字列中の空白との区別がつきません。 そこで、'\0' のひとつ手前から文字列の先頭に向かって空白を読み飛ばします。 for の中身は空文 ; ですから、空白文字が続く間は何もせず読み進みます。
 for を抜けたら(先頭に行き着くか空白でない文字になった)、次の要素に '\0' を入れ、文字列をそこまでとします。

前にある空白の除去

 こちらも for文で先頭から空白を読み飛ばします。
 i > 0 なら先頭に空白があったということなので、空白の後ろの文字列を先頭から始まるように移し、'\0' でストップします。

(今回のクイズです)
     while( s[i] ) s[j++] = s[i++];
     s[j] = '\0';
 のコードは、処理の意図がよく分かるように書いたものですが、カーニハン&リッチーの本「プログラミング言語C」風に書くと、次のようにすることもできます。 この処理内容を説明してみましょう。
     while( (s[j++] = s[i++]) != '\0' ) ;
   (答えは、次回のC言語の Tips で ・・・)
前回のクイズの答え: (前回の問題を見る
(1) 正しい : 配列nlst の先頭から3つ目のアドレスを np に代入している
(2) 正しい : str+i のアドレスにある値なので、str[i] と同じ
(3) y : '\0' のひとつ手前にある文字が表示される