プログラムの中で、標準入力から入力されたコマンドや文字列を取得する場合、C言語ではscanf、gets、fgetsなどを使って取得するのが、一般的だ・・・。
しかし、scanfは文字列中に空白などがあると、文字列が切れてしまう・・・。スペース区切りで複数のパラメータを入力したりなど、コマンド入力としての使い方を前提に作られている・・・。
gets、fgetsはスペースも含めて格納してくれるが、getsにはセキュリティの問題があるし、fgetsは格納先の文字配列サイズ - 1未満の文字列だと、改行文字を入れられてしまう・・・。
そこで、まずは末尾の改行を除去する関数trim_left_lfを作る・・・。
#include <stdio.h> #include <string.h> int trim_left_lf(char *str);
指定した文字列strから末尾の改行を除去する・・・。
戻り値には、除去後の文字列の長さを返す・・・。
ただし、末尾が改行ではない場合は、何もせず-1を返す・・・。
関数の定義・・・。
文字列の長さを格納するlen・・・。
strlenでstrの長さを取得し、lenに格納・・・。
lenが1未満の空文字列("")だったら、-1を返して終了・・・。
末尾が改行'\n'かどうかを判定する・・・。
長さlenの文字列の末尾はstr[len - 1]だから、
str[len - 1] == '\n'なら、そこに'\0'を代入する・・・。
これで改行は消えて、1つ手前が末尾となる・・・。
除去後の長さは1つ減ってlen - 1になるので、それを返す・・・。
一方、'\n'じゃない場合は、何もせずに-1を返す・・・。
この関数を使って、除去前と除去後を比べてみる・・・。
入力された文字列をfgetsでstr(要素数32)に格納する・・・。
改行除去前は、
$ ./trim_left_lf str: ABCDE str(before): [ABCDE ]
'E'のあとに改行されていることがわかる・・・。
その後、trim_left_lfを呼んで、
除去後のstrを出力すると、
str(after): [ABCDE]
改行されていない・・・。除去できている・・・。
一方で、長さ31(要素数32 - NULL文字1)以上だと、改行が入らないので、
$ ./trim_left_lf str: ABCDEABCDEABCDEABCDEABCDEABCDEABCDE str(before): [ABCDEABCDEABCDEABCDEABCDEABCDEA] str(after): [ABCDEABCDEABCDEABCDEABCDEABCDEA]
何もしない・・・。