掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29791

使わないほうがいいライブラリ関数
投稿者---にほ(2007/02/20 15:00:52)


いつも拝見させていただいております。
初歩的な質問で恐縮ですが、教えてください。

私はfgetsで[csvファイル]を読込んだ際、カンマ区切りなので【strtok関数】を使ってカンマまでの文字列を取得していました。

しかし、【strtok】が少し変な結果を生むことがあり、
(私のポインタに関する理解が浅いためでしょうか)
ネット等で調べたところ【strtok】はあまり使わないほうがいいというようなことを読みました。
(もしかしたら、違う意図であったのかも知れませんが…。)

【strtok】はあまり使わないほうがいいのでしょうか?
また、【strtok】以外にもあまり使わないほうがいいライブラリ関数はあるのでしょうか?
まだC言語の勉強を始めたばかりで、仕事ではプログラミングをしていないため、あまり使わないほうがいい関数というのがよく分かりません。
どうか教えてください。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:使わないほうがいいライブラリ関数 29792 jazz 2007/02/20 15:37:49
<子記事> Re:使わないほうがいいライブラリ関数 29793 kolona 2007/02/20 16:04:32
<子記事> Re:使わないほうがいいライブラリ関数 29796 ルナレルナ 2007/02/20 16:23:47
<子記事> Re:使わないほうがいいライブラリ関数 29797 あかま 2007/02/20 16:37:18
<子記事> Re:使わないほうがいいライブラリ関数 29798 ルナレルナ 2007/02/20 16:51:40
<子記事> Re:使わないほうがいいライブラリ関数 29800 にほ 2007/02/20 17:27:24
<子記事> Re:使わないほうがいいライブラリ関数 29803 とろり 2007/02/20 18:19:51


No.29792

Re:使わないほうがいいライブラリ関数
投稿者---jazz(2007/02/20 15:37:49)


以下、あくまで私見です。人によって考えは異なると思います。
jazzは、gets関数を使いません。理由は次のとおりです。

gets関数は、引数に指定した領域の大きさを超えて入力しても、
そのことをチェックしません。
その結果、別の変数のために確保した領域を壊してしまうおそれがあります。
壊れてしまった領域に、次にアクセスしたとき、
プログラムがどういう動きをするか、予測できません。
異常終了してしまうかもしれませんし、また別の領域を
壊してしまうかもしれません。
このように、gets関数は危ない振る舞いをすることがあります。
したがって、使いません。


この投稿にコメントする

削除パスワード

No.29793

Re:使わないほうがいいライブラリ関数
投稿者---kolona(2007/02/20 16:04:32)


>しかし、【strtok】が少し変な結果を生むことがあり、
>(私のポインタに関する理解が浅いためでしょうか)
>ネット等で調べたところ【strtok】はあまり使わないほうがいいというようなことを読みました。
>(もしかしたら、違う意図であったのかも知れませんが…。)
>
変な結果,というのがどういう動作であるのかがわからないとなんともいえません。もしかしたら漢字などの中にカンマの文字コード(SJISだと44)が入っていたとか?
一般にstrtokが嫌われるのは、strtokがオリジナルの文字列を破壊するからです。
分解したい1行を後でまた使うならコピーを渡す必要があります。
あと、実装によるかも知れませんがstrtokはstatic変数を記憶用に使っています。
そのため、並行して2つの文字列を分解できません。

あと嫌われる関数はscanfとかですかね。scanfはユーザーの気まぐれな入力で暴走するので"うまく"フォーマットを指定する必要があります。

strcpy()やstrcat()なんかもgets()同様バッファの保護ができないので推奨されない場合があります。



この投稿にコメントする

削除パスワード

No.29796

Re:使わないほうがいいライブラリ関数
投稿者---ルナレルナ(2007/02/20 16:23:47)
http://park6.wakwak.com/~nougaki/mini_program/


どの関数に限ったことでなく、使う必要が無いのに使われている関数。


この投稿にコメントする

削除パスワード

No.29797

Re:使わないほうがいいライブラリ関数
投稿者---あかま(2007/02/20 16:37:18)


基本的に初心者を名乗るうちは使えるものは使ったほうがいいんじゃないかなと。
ぶっちゃけ下手に自分で作るよりは安全ですよ。

挙げられているgets(),scanf(),strcpy(),strcat()は
望まない入力をされたときに、問題があるといわれています。

gets(),strcpy(),strcat()
→n文字分しか領域ないのにそれ以上入力されると危険

scanf()
→数字がほしいのに、それ以外の文字を入力されると危険

という具合です。

gets()はfgets()で代用可能
strcpy(),strcat()は使う前に文字数をチェックすればok(もしくはstrncpy)
scanf()はfgets()+sscanf()で代用可能

というように大抵は代用or簡単な回避策があるもんです。
「よくわからないけど危険だから使わない」ではなくて、
「なにが危険かを知っておく」のが必要です。
絶対に文字数オーバーの起こらない状況ならgets(),strcpy(),strcat()を使っても安全なわけですから。

strtok()も文字列をコピーしておけばいいだけですし、
ガンガン使っちゃえばいいと思いますよ。


この投稿にコメントする

削除パスワード

No.29798

Re:使わないほうがいいライブラリ関数
投稿者---ルナレルナ(2007/02/20 16:51:40)
http://park6.wakwak.com/~nougaki/mini_program/


>しかし、【strtok】が少し変な結果を生むことがあり、

ではなく、
あなたの思う結果と、strtok()の結果が違う。
あなたの思う結果は、あなたがしっかりと確認。
strtok()の結果は、strtok()についての説明を読む。

あなたの思う結果に、strtok()の合わせるようには動きません。
strtok()は、strtok()の動きしかしません。

strtok()は、万能ではありません。
万能ではありませんが、あなたの思う結果に対して、
80〜90%は、答えているのではなかと思います。


>ネット等で調べたところ【strtok】はあまり使わないほうがいいというようなことを読みました。

どこで読みましたか?


この投稿にコメントする

削除パスワード

No.29800

Re:使わないほうがいいライブラリ関数
投稿者---にほ(2007/02/20 17:27:24)


>いつも拝見させていただいております。
>初歩的な質問で恐縮ですが、教えてください。
>
>私はfgetsで[csvファイル]を読込んだ際、カンマ区切りなので【strtok関数】を使ってカンマまでの文字列を取得していました。
>
>しかし、【strtok】が少し変な結果を生むことがあり、
>(私のポインタに関する理解が浅いためでしょうか)
>ネット等で調べたところ【strtok】はあまり使わないほうがいいというようなことを読みました。
>(もしかしたら、違う意図であったのかも知れませんが…。)
>
>【strtok】はあまり使わないほうがいいのでしょうか?
>また、【strtok】以外にもあまり使わないほうがいいライブラリ関数はあるのでしょうか?
>まだC言語の勉強を始めたばかりで、仕事ではプログラミングをしていないため、あまり使わないほうがいい関数というのがよく分かりません。
>どうか教えてください。


みなさん、ご回答をどうもありがとうございます。
怖いから使わないのではなく、関数それぞれの持つ注意点をしっかり学習することが大切ですね。
気をつけながら、どんどん使ってみようと思います。
本当にありがとうございました。



この投稿にコメントする

削除パスワード

No.29803

Re:使わないほうがいいライブラリ関数
投稿者---とろり(2007/02/20 18:19:51)


こんにちは。

>しかし、【strtok】が少し変な結果を生むことがあり、
>ネット等で調べたところ【strtok】はあまり使わないほうがいいというようなことを読みました。

マルチスレッドのことを言っているのかもしれませんね。
http://docs.sun.com/app/docs/doc/819-0390
http://docs.sun.com/app/docs/doc/819-0390/6n2qp46f3?a=view


あと、a,,,b, みたいな文字列があった場合、strtok()は空文字を無視しますから、
それで変な動作をしたのかもしれません。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧