スチールウールの活動記録

初心者に向けて(私もだけど)電子工作やプログラミングや関連することをいろいろ。

fgetsの改行コード

久しぶりに更新。書くことなさすぎてつらいね。

 

C言語の勉強していたらgets関数が危険と書かれてて、代わりにfgets関数を使おうみたいなことをこないだ見たので、使ってみることにした。

 

gets関数はgets(str)のようにして文字を入力できる関数。しかし、この関数の問題は入力された文字列が、strの配列のサイズを超えるとき、バッファオーバーランが起こって危険。

fgets関数ではfgets(str,len,stdin)(stdinはキーボードからの入力)の用に使う。gets関数との違いは引数に"len"があり、これによって格納する文字数を決められる。単純にその配列をフルに使いたいなら、fgets(str, sizeof str, stdin)とすればいい。

 

だけど、このfgets関数を使っていたわけだけども、問題が発生した。それは…

改行コードまで入ってしまうということ。

文字列を比較するのに、<string.h>の中にあるstrcmp関数を使っていたわけなんだけど、改行コードが入ってしまうためにstrcmp関数がうまく機能しない!仕方なくstrncmp関数を使っていたけども、それだと初めから指定した文字数まで一致してれば良くなるのでだめ(´ε`;)ウーン…

 

じゃあ、どうすればいいか…なら、改行コードを消そう!

でも消し方なんて知りません^^;

 

問題なのは最後に改行コードが入ってしまうこと…

 

ならば、改行コードの場所を見つけてその場所を書き換えればいける!

 

と、いうことで、<string.h>の中のstrchr関数を使います。この関数は文字列の後ろから指定した文字を探し、その場所のポインタを返すというもの。これを使い、後ろから改行コードを見つけ出し、その場所を '\0' で書き換えればおk。それを関数化すればできる。

 

そこで関数を作ってみた。(出来の悪いプログラムかもしれんが…)

char* strget(char* str, int len);

char* strget(char* str, int len){
    char *nlstr;
    fgets(str, len, stdin);
    nlstr = strchr(str, '\n');
    if (nlstr != NULL) *nlstr = '\0';

    return str;
}

 

これでいいんじゃないかな。strget(str,sizeof str); みたいに使える。

 

これで自分のやりたかったことはちゃんとできた。(ホントは引数を1つだけにしたかったけど(-_-;))

誰かもっといい方法あったら教えて下さいm(_ _)m