2011年10月1期プログラムscanfはなぜ糞仕様なのか TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
C#は糞2.0
「Cでプログラミングするには人生は短すぎる」か?
【初心者お断り】ガチ規格準拠C専用スレ Part134
VB6でLinuxを作る方法を教えてください!!


scanfはなぜ糞仕様なのか


1 :10/08/17 〜 最終レス :11/12/30
?

2 :
糞スレ

3 :
最近Cプログラミングを始めたの?
ガ・ン・バ・レ!

4 :
今日も暑いな

5 :
入門用だからシンプルすぎるんだろ

6 :
           皆様へのお願い
  このスレッドは高次機能障害をもたらす
病理の臨床実験のために立てたものです。
  被験者と研究員のやり取りに使うため、
書き込み等は自重されるようお願いいたします。
もし、書き込み等をすることで不愉快な思いをされましても、
当研究所は責を負いかねます。
                      (社)京都微生物研究所

7 :
アイちゃんは昔からよく見たけど、最近は>6が主流なのか?

8 :
>>5
ぜんぜんシンプルじゃない。

9 :
バカはC#(笑)使ってるのがお似合いだと思います

10 :
>>9
それはscanf()は最高級に難しいテクノロジーでそれをバカにするのは
それを使いこなせないC#ユーザーに違いないという推測に基づく発言か。
残念ながら、scanf()がクソだというのはプログラマの99%の共通認識だ。
そう認識してないのは専門学校のscanf()を使いまくったみたいな
テキストで勉強してそのレベルにとどまってるPGだけだ。

11 :
scanfは、Cライブラリ最大の糞仕様といっていい。

12 :
このスレッドは天才pンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
                  京都大学霊長類研究所

13 :
まあなんだかんだいっても大会とかで使うんですけどね

14 :
scanfという文字列を20年ぶりに見た

15 :
sscanf()なら使うけどねぇ。
scanf()系は入力を破棄し難いこととprintf()系の"%*d"みたいな
動的な幅指定がないのは厄介だけど、
文字列を対象とするsscanf()ならそれなりに使える。

16 :
糞仕様だよ使えねーで済ませれば問題無いのに
初心者用入門書で最初の方で出てくるからなぁ

17 :
初心者だからこそあえて洗礼を浴びせるのだ

18 :
どのみちCはプログラマ自身がメモリ管理に精通しないと使いこなせないからな
一から十まで初心者に扱いやすいライブラリなんか用意しておく道義すらない

19 :
初心者本でscanf()を使う奴は実務経験ないんじゃないかと思う。
まぁ、実務経験があってまともに文章を書けるのなら初心者本以外の仕事があるんだろうけれど。
ついでに言えば、printf()系でも"%f"を闇雲に使うよりは"%g"を使わせた方が余程初心者に向いていると思う。
酷い本になると、printf()系とscanf()系の書式指定子は互換性があるみたいな大嘘を書いてあるからね。

20 :
printf("%lf", d);
は良く見かける

21 :
>>20
それも問題だね。

22 :
scanf_s

23 :
fortranと違って、組み込みではないから
しかたがない。

24 :
正規表現か何かのパターンマッチは標準で欲しいな
ライブラリ探してくるのめんどい

25 :
>>24
スキャンセットだけでは不足ですか?
尤も、入門書でスキャンセットの存在にまで言及しているものは少ないし、
実例を挙げているものは皆無に等しいから面倒であることには同意。

26 :
> 初心者用入門書で最初の方で出てくるからなぁ
ゴミみたいな奴だな
今日何ゴミの日だっけ?

27 :
不燃物
びん、缶 (飲料缶除く)、天使を騙る痛いニート等

28 :
>>27
------------------
[[[[[[[[[[[[ びん、缶 (飲料缶除く)、天使を騙る痛いニート等 ]]]]]]]]]]]](きリッッッッ!!ッ!!!
--------(キリ!!キリッッ!きリッ!!!キリッ!!!
気持ち悪い

29 :
[迷信] scanf ではバッファオーバーランを防げない
http://www.kijineko.co.jp/tech/superstitions/buffer-overrun-of-scanf.html

30 :
>>29
scanf("%10s", s); とかフォーマット文字列にバッファサイズ直書きしなければ
ならないのがすごいイヤな感じ。
バッファに残ったデータを読み飛ばす方法とかテクニックに走りすぎで美しくないし。
読み込みの単位が文字単位でも行単位でもないのが気持ち悪い。
あと%dとかで数値を読むときにオーバーフローを検出できないのもあとあと
面倒になる。

31 :
>>30
そこはリンク先も言及してるね、まぁその時点でクソ仕様なわけだがw
別にリンク先がscanfは素晴らしいとか言ってるわけではないからどうでもいいか

32 :
文字列から数値にするならエラーチェック出来るstrtol()使えってことだな

33 :
>>30
>scanf("%10s", s); とかフォーマット文字列にバッファサイズ直書きしなければ
>ならないのがすごいイヤな感じ。
scanf 系関数での文字列長指定方法
http://www.kijineko.co.jp/node/201

34 :
あそこまで来たら素直にfgets使えよってなるしなw

35 :
昔、処理が遅すぎる時代に自動化させるために使ったという話をどこかで聞いたような

36 :
でにすりっちーさんのごめいふくをおいのりします
          _____
  .ni 7    /        \  ご冥福をお祈りします
l^l | | l ,/) / /・\  /・\ \    .n
', U ! レ' / |    ̄ ̄    ̄ ̄  |  l^l.| | /)
/    〈  |    (_人_)    |  | U レ'//)
     ヽっ     \   |    /   ノ    /
 /´ ̄ ̄ ノ     \_|    \rニ    |
                      `ヽ   l

37 :
>>33
うわぁ。やめてほしい。

38 :
sscanf()はわりと使ってるかも。

39 :
>>37
お前が理解できないことやってるからか?ww

40 :
>>15
scanf( "%*s" );
入力破棄なんて、これだけの事でしょ。
if( 1 != scanf( "%d", &value ) )
      scanf( "%*s" );
入力失敗だってこれだけで廃棄できる。
>>24
パターンマッチ自体は、scanfでできるじゃん。
if( 1 == scanf( " < %s", tag ) )
{
      do
          count = scanf( " %[ \t\n] = \"%[^\"] %[/>]%[>]",  &key, &value, &terminate, &terminate );
      while( 2 != count );
}
例えば、こう書けば、下みたいなタグしか拾ってこなくなる。
<tag key = value"/>
<tag key = value">
<tag
   key = "value"
>

41 :
馬鹿には無理

42 :
>>30
#define Q(n) #n
#define LEN 10
char array[s];
scanf("%" Q( LEN ) "s", &s);
これで直書き自体は防げるぞ。

43 :
まちげぇた。
× while( 2 != count );
○ while( 2 == count );

44 :
肝心なとこも間違えてたわ。すまんすまん。
× " %[ \t\n] = \"%[^\"] %[/>]%[>]"
○ " %s = \"%[^\"] %[/>]%[>]"

45 :
>>30
32bitで10億未満なら、フィールド幅を9桁にして、
その後判定すりゃいい。
10億越えるなら、32bit以上の型で読み取れ。

46 :

char array[s];
char array[s];
char array[s];
char array[s];
char array[s];

47 :
scanf便利じゃん。

48 :
いや、つかえねーわ。

49 :
お前がな

50 :
UNIXを使ったことのないガキが言ったんだろ?

51 :
ふーん

52 :
scanf()とfscanf()を使ってるやつは信用できない。
sscanf()は、まあ許す。

53 :
意味が解からん。sscanfはバッファー移動させる分非効率じゃん。
sscanfは自動でバッファーのシークまでしてくれないぞ。

54 :
しないから良いんだよ馬鹿

55 :
scanfに限らないけど、対話が必要ならどうしてもGUIの方に分があるよね

56 :
replはCUIじゃないと

57 :
>>54
ストリームデータに対しシークしないことになんのメリットがあんだよ

58 :
scanfにケチつけてるヤツの何がイラッとするかって、
scanfで設定ファイルの解析すらしたこと無いくせに
ドヤ顔をで糞だと言っているところ。
使ったこともないプログラミング言語を貶してる連中と
同じウザさがある。

59 :
そういう時は、普通はfscanf()を使うかfgets()とsscanf()を使うからなぁ。

60 :
scanfもfscanfも大差ないがな
ただシェルをメインで使うなら
$xxxx-restore < xxxx.config
ってな感じで読み込む事はある。
あと設定じゃなきゃパイプ処理で重宝する
mplayer $( ls -l | a.out -m "50" )
とか、フォーマットの決まったデータをフィルタするのにね

61 :
嘘を嘘と見抜けないひとは scanf を使うのは向かない

62 :
>>53
バッファに移動するのが非効率とか、そんなパフォーマンス気にするならscanf()とか使うなよ。

63 :
速度の効率じゃなく記述の効率だろ

64 :
sscanfで簡潔に書けるというなら、
sscanfでこれと同じ動作するコード書いてみろよ。
int count;
do
{
     char key[1024], value[1024], invalid_string[4096];
     count = scanf( " %1023[^\t\n =] = \"%[^\"]\" ;", key, value );
     switch( count )
     {
          case 2:
                map[key] = value;
          break
          case 1:
               throw ParseValueInvalid( key );
          case 0:
               scanf( "%4095[^;];", invalid_string );
               throw ParseError( invalid_string );
     }
}while( EOF != count );

65 :
>>64
valueに改行を含めるって仕様にしなかったらsscanf()でも一行増えるだけなんじゃね?

66 :
エラーリカバリが面倒だからエラーが起きたら例外なげてるんだろうけど、
シンプルに一行一データって仕様にしたら、エラーのあった行だけ棄てて
次に読み進めるって処理も簡単に書けるな。
つまりシンプルにfgets()を使うのが、処理に柔軟性を持たせてまぎれのない
コードになるっていつもどおりの結論だ。

67 :
scanf( "%*[^;];" );
破棄するほうが簡単なんだけど。

68 :
>>65
ポインタのシークとバッファをまたがる値に対する処理が入る。
4行以上は増えるだろ。

69 :
>>66
自分でいったとおりコード書いてみろよ。
そのやり方でもscanfで書いたほうが短いから。

70 :
scanfの仕様を把握してないバカの言い訳が見苦しいなw

71 :
だからscanfは糞だって言われてるんだよ

72 :
scanf一つでプログラマの習熟度が解るな

73 :
649 デフォルトの名無しさん [sage] 2011/12/29(木) 14:50:37.28 ID: Be:
学生プログラマ日本一決定戦(予選は社会人も参加可)
ttp://codevs.jp/howto.html
現在予選開催中
応募締切 2012.1.6 12:00
おもしろいことやっているじゃん。誰か今から参加しろよ。

74 :
>>66
記述量が多くなるわけだが。

75 :
>>66
ループ中で>>64を関数として呼び出し、読み込みを継続する事もできるんだけど。
ループ中で例外受け取って、
例外内容は例外リストに追加。
次の読み込み処理を実行。

76 :
>>66
1行1データに囚われてる時点で柔軟性に欠けてるだろ
Jsonに書き直そうとしただけで大幅に手間が掛かる

77 :
>>67
それ、エラーのあった行に ; が無かったら次の正常な行まで読み飛ばすじゃん。
iniファイルもどきの初期設定ファイルなんだから、変に仕様を複雑化しないでやっぱ一データ一行のほうがシンプルでいいな。

78 :
>>76
scanf()でもjsonのパースとかできなさそうだけど。

79 :
>>76

80 :
>>78
すでにスレに上がってるコードみても分からないの?
コード書いてもらわないとダメなの?

81 :
>>77
何か問題でも?
CやXMLのパーサーでも同じだろ
iniしかパースした事ないの?

82 :11/12/30
>>77
改行が消えて次の行と繋がったら、
次のデータ読み飛ばされるじゃねぇか
変わらねぇよ。
TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
C#は糞2.0
「Cでプログラミングするには人生は短すぎる」か?
【初心者お断り】ガチ規格準拠C専用スレ Part134
VB6でLinuxを作る方法を教えてください!!