void trim( char *s ) s の前後から空白を除去する
空白かどうかは isspace関数で判定します。全角空白や文字列の途中にある空白は、除去しません。
#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# # 前後は全角空白 #
こちらも for文で先頭から空白を読み飛ばします。
i > 0 なら先頭に空白があったということなので、空白の後ろの文字列を先頭から始まるように移し、'\0' でストップします。
while( s[i] ) s[j++] = s[i++]; s[j] = '\0';のコードは、処理の意図がよく分かるように書いたものですが、カーニハン&リッチーの本「プログラミング言語C」風に書くと、次のようにすることもできます。 この処理内容を説明してみましょう。
while( (s[j++] = s[i++]) != '\0' ) ;(答えは、次回のC言語の Tips で ・・・)