読者です 読者をやめる 読者になる 読者になる

trim_left_lf

C言語 Test

プログラムの中で、標準入力から入力されたコマンドや文字列を取得する場合、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]

何もしない・・・。

Test/trim_left_lf.c at master · bg1bgst333/Test · GitHub