C言語なら俺に聞け 155

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/07/06(月) 17:43:57.76ID:Js6m+wFY0
>>414
出来るけど、そのレベルの初心者にきちんとしたやり方を説明するのは難しいので
とりあえず入門書を最後まで読んでからにして。
2020/07/06(月) 19:26:19.29ID:y838Udr90
>>414
scanf("%255s", a);
とか書いとけばいーんだよ こんなもん
scanf使うなとか言うアマチュアは脳死
2020/07/06(月) 19:39:29.44ID:A/JwDwXO0
後続処理で問題が起きる
2020/07/06(月) 19:40:44.58ID:X9mxW4kC0
a[255]=0;
2020/07/06(月) 20:42:40.45ID:sDUgop1M0
scanfは入力ミスでへんな無限ループに陥ったことがあるからなぁ。
2020/07/06(月) 20:45:13.65ID:X9mxW4kC0
それはscanfの問題?
2020/07/06(月) 20:50:02.85ID:sDUgop1M0
入力バッファに改行が残って云々ってことらしい。
2020/07/07(火) 06:45:34.69ID:hl3O6vw80
scanfの問題ではないね
!=EOFなんて書くバカが100%悪い
2020/07/07(火) 07:24:10.77ID:stuZ2AfxM
入力バッファに残った改行コードが問題の場合は fflush(stdin) で吐き出さないとどうにもならない
2020/07/07(火) 07:43:16.74ID:bJbvn87/0
fflush() が確実に効くのは出力ストリームだけでしょ。
stdin でも使える独自拡張された環境もあるか知れんけど。
2020/07/07(火) 07:54:27.38ID:p6ZLMZTk0
scanf前にバッファクリアするコードあったけど、
そういうやつってパイプやリダイレクトつかっても正常作動するの?
2020/07/07(火) 11:09:20.23ID:qR67pRFEM
パイプやリダイレクトか判定する方法がOSによって提供されてる環境なら問題ない
2020/07/07(火) 12:04:22.54ID:tzlORGl20
方法が用意されててもそれをきちんと利用してるソフトが少なかったら意味ないぞ。
2020/07/07(火) 12:19:33.35ID:/8q6WRwjd
scanfをそのまま不特定多数が使うソフトに入れることなんかないんだから

正しく入力してください
で終わる
2020/07/07(火) 13:58:40.76ID:OPOprIbsd
scanfを何に使うかという話と
仕様を理解して使うという話は
別問題だ
430デフォルトの名無しさん (エムゾネ FFaa-A0XE)
垢版 |
2020/07/07(火) 14:00:00.91ID:092JXqIfF
>>416
scanf("%*s", 255, a);
みたいなのなかったっけ
うろ覚え
2020/07/07(火) 16:19:53.16ID:bJbvn87/0
scanf には * の指定子ないんだわ。
432デフォルトの名無しさん (アウアウウー Sacf-Im8i)
垢版 |
2020/07/07(火) 18:32:30.56ID:e1WbjzO/a
* には別の意味がある。
2020/07/07(火) 19:29:43.35ID:USscR6RS0
引き数から引っ張ってくる * がないとなると
sprintf で scanf フォーマット文字列を作るということになる?のか?
2020/07/07(火) 20:01:20.05ID:7uEBIb8CH
>>423
それは環境依存
2020/07/08(水) 06:21:59.38ID:sJ2uy93A0
>>432
scanf の * 書式指定子は「読み捨て」の指示だったね。
printf の * とは使い方が違うけど、ちゃんとある。
…存在をすっかり忘れてたよ。ありがとう。


>>433
カーニハン&パイクの『プログラミング作法』には
sprintfで書式指定文字列を作る方法が載ってるね。
下に示す例に比べれば手軽で分かりやすい。

入力文字幅がコンパイル時固定ならマクロを駆使して…

// マクロ名を「マクロの内容を表す文字列」に変換するマクロ関数
#define MACRO_TO_STR_SUB(name) #name
#define MACRO_TO_STR(name) MACRO_TO_STR_SUB(name)

#define WIDTH 15 // 入力制限字数(末尾の'\0'を含まない)

 char buf[WIDTH+1]; // +1 for '\0'
 scanf("%" MACRO_TO_STR(WIDTH) "s", buf);

こんな感じにできるけど、面倒でしょ。
2020/07/08(水) 06:35:08.91ID:SF9V14yC0
char fmt[(size_t)floor(log10(~(size_t)0) + 1) + 3];

char buf[256];
sprintf(fmt, "%%%llus", sizeof buf - 1);

scanf(fmt, buf);
437デフォルトの名無しさん (エムゾネ FF43-VqvP)
垢版 |
2020/07/08(水) 09:30:02.93ID:hADFKHguF
>>435
scanf("%" #WIDTH "s", buf);
じゃだめなんですか?
2020/07/08(水) 10:07:58.22ID:SF9V14yC0
単項#はマクロの中でしか使えない
439デフォルトの名無しさん (エムゾネ FF43-VqvP)
垢版 |
2020/07/08(水) 10:11:35.43ID:hADFKHguF
#define MACRO_TO_STR(name) #name

そもそもこれもだめなんですね
2020/07/08(水) 10:34:21.44ID:SF9V14yC0
んなわけねえだろ
なんでやねん
2020/07/08(水) 10:59:20.81ID:g3a6T0uX0
後でメンテが大変だぞ
半年経ったら、今の自分が他人になる
442デフォルトの名無しさん (JP 0H93-4zP6)
垢版 |
2020/07/08(水) 11:22:06.26ID:woPNJQ5aH
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
2020/07/08(水) 11:45:14.69ID:KKQXIGLi0
#define WIDTH 10
#define MACRO_TO_STR(name) #name

MACRO_TO_STR(WIDTH)
は渡された識別子をそのまま文字列化するので "WIDTH" になる

マクロWIDTHを展開した後での文字 "10" が欲しいときは >>435 のように
一見無駄に見えるマクロのピンポンを行なう
2020/07/08(水) 11:48:56.64ID:l8qeRlOJd
x0000.netをNGっと
2020/07/08(水) 12:22:54.79ID:SF9V14yC0
ああ、そういうことか
解説dx
2020/07/08(水) 13:27:10.12ID:0ZaAZSr60
>>428
その「正しく入力してください」に至らないのが今回の話題
2020/07/08(水) 16:37:27.08ID:mO8IXR2n0
>>444
まだやってなかったのか?
2020/07/08(水) 17:48:03.59ID:T5O+XOTRd
>>446
ん?
コードで表示しろって言ってるんじゃない
クレームが来たらその人に対して言えってこと

つまり
不正入力時の動作は不定がソフトの仕様
で問題ないだろってこと
2020/07/08(水) 18:06:49.38ID:EQ9tLW1C0
不正入力ではなくてコンソールと入力バッファの仕様が問題
標準入力stdinがキーボードの場合入力バッファには目的とする文字コードの直後に必ず改行コードが残る
scanfの書式が%dなどの数値型だと改行は取り込まれないので数値型を連続して使用した場合は型が合わずに続くデータを取りこぼす
2020/07/08(水) 18:11:07.83ID:SF9V14yC0
ん、%dは先行する空白類文字をスキップするぞ
2020/07/08(水) 18:25:39.71ID:QndvSIjd0
>>449
正しい入力で正しく動かないならそれはバグだよ
2020/07/08(水) 18:29:27.69ID:EQ9tLW1C0
訂正
たしかに数値型だけなら問題はないね
数値型と文字型の混在時に問題が起きる

scanf("%d", &x); // 数値 + 改行
...
scanf("%c", &y); // 必ず直前の改行となるので入力不可
...
scanf("%d", &z); // 数値 + 改行
453デフォルトの名無しさん (アウウィフ FF09-VqvP)
垢版 |
2020/07/09(木) 09:32:01.69ID:vrNDocOmF
無理にscanf使わずに
fgetsとsscanfやろ
2020/07/09(木) 09:45:13.42ID:jzluGOwX0
またアホが湧いた
455デフォルトの名無しさん (ワッチョイ 23ad-Bqa1)
垢版 |
2020/07/09(木) 09:51:17.63ID:RjpwDZh+0
Windows10proでC使いたいんです。
目的は大量のテキストデータの変換なので、
グラフィックとか音とかはプログラミングしません。

テキストでコーディングして、
CUIで実行ってな感じができればいいんですけど、
このぐらいだとMinGWが適当なんでしょうか?
2020/07/09(木) 09:57:12.39ID:uQo6bqoB0
tdm-gcc
457デフォルトの名無しさん (ワッチョイ 23a5-T5iX)
垢版 |
2020/07/09(木) 09:57:39.86ID:f5aLRaXK0
https://www.gnu.org/software/coreutils/coreutils.html

このツールをDLしてwindowsフォルダに全部入れる
2020/07/09(木) 10:57:01.79ID:g1m/M0Pb0
>>453
プログラミングの教育現場では、未だにscanf()が使われているんだ
この関数の欠陥部分も含めて教育の題材にはいいんじゃないかな
459デフォルトの名無しさん (アウウィフ FF09-VqvP)
垢版 |
2020/07/09(木) 11:04:23.27ID:vrNDocOmF
一行目も二行目も知ってる
2020/07/09(木) 12:36:53.26ID:ccQ+p+MVM
>>454
>>453は正しいだろ

>>458
対策しようのない欠陥だから唯一できる教育は「使うな」しかないけどね
2020/07/09(木) 12:39:21.11ID:zi4hgNgDd
初心者教育でとりあえずコードを書い動かしてみる
でscanfじゃなきゃ何を使えって?
2020/07/09(木) 12:41:37.65ID:jzluGOwX0
>>460
対策しようのない欠陥と自分で言いながら何が正しいとぬかす?
2020/07/09(木) 12:42:19.97ID:2UhyUN9nd
fgets
2020/07/09(木) 12:48:17.81ID:jzluGOwX0
配列もFILE構造体も教えてない時点でfgetsとsscanfとか無理だろ
逆にこの辺まで教えてまだ実用的な入力関数が作れないようなら教え方が下手すぎ
2020/07/09(木) 12:49:49.88ID:jzluGOwX0
つーか、その被害者がいつまでもfgetsとsscanfにしがみついたまま進歩しないんだろうが
2020/07/09(木) 15:17:37.22ID:ccQ+p+MVM
>>462
対策しようがないから使わず他の関数使う
って話なんだが、理解できないのか?w
2020/07/09(木) 15:18:31.71ID:ccQ+p+MVM
>>465
お前みたいな老害はそうなのかもなw
2020/07/09(木) 16:18:37.55ID:jzluGOwX0
>>467
fscanfとsscanfにしがみついてるのはお前
俺はそんなアホなことしてない
469デフォルトの名無しさん (エムゾネ FF43-VqvP)
垢版 |
2020/07/09(木) 16:39:16.37ID:8CMntJuyF
scanf要らねと思ったら後はgetcharで何でも出来るだろ
2020/07/09(木) 18:22:16.49ID:EQDklninM
>>468
ならいいじゃん
お前以下の奴なんてめったにいないんだしw
2020/07/09(木) 18:51:05.00ID:jzluGOwX0
>>470
罵倒だけのレスもらうと優越感で気持ちいいわ
2020/07/09(木) 19:04:00.56ID:g5p2N13I0
代案出さずに否定だけって
ダサい
2020/07/09(木) 19:22:40.81ID:0UE7wqUeM
罵倒だけの>>468みたいなレスを見ても別に優越感なんて感じないけどね
むしろ憐れみしか感じないw
2020/07/09(木) 21:17:48.63ID:jzluGOwX0
>>473
まあいいからfgetsとsscanfにしがみついてろよ
俺がどうかしてやる筋合いないし勝手にしな
2020/07/09(木) 21:18:33.10ID:jzluGOwX0
ここ技術板だぜ? 少なくとも何らか専門用語入れようや
2020/07/09(木) 22:17:39.65ID:bcr0ax7J0
> 罵倒だけのレスもらうと優越感で気持ちいいわ
どこに専門用語があるんだろう…?
ますます哀れに思えてきたわw
2020/07/10(金) 06:59:30.23ID:d1dEL6aU0
技術的な話で突っ込めなくなってる無様な姿が最高の褒め言葉さ
2020/07/10(金) 07:01:07.48ID:d1dEL6aU0
fgetsとsscanfを使うのが正しい!と強弁してるだけで説得力ねえんだよ
2020/07/10(金) 07:40:55.73ID:qqWcHkmP0
>>478
scanf使うならfgetsとsscanf使えって話が出ただけでないの?
2020/07/10(金) 07:44:14.14ID:d1dEL6aU0
scanfの使い方の話をしてたんだよ
そこへ付いて来れないからって他の関数を使えと話を逸らしに来たやつがいて
アホつったら何の説明もなしにfgetsとsscanfを使うのが正しいと強弁する別のアホが来た
2020/07/10(金) 07:49:10.16ID:d1dEL6aU0
464あたりでscanfを使う理由をちゃんと説明しているのに
そこは無視してくだらねえ戯れ言ばかりぬかしやがる
2020/07/10(金) 07:54:54.37ID:7RoGj1wV0
>>464はscanfを使う理由ではない
2020/07/10(金) 08:08:34.80ID:d1dEL6aU0
だから何の説明もなしにdisっても説得力ねえんだってば
2020/07/10(金) 08:09:27.01ID:a7Xsl7M10
scanf使いたいなら割り切って使うか、それで起こる問題を解決したいなら別の関数使えって流れじゃないの?
モメるポイントが分からんのだが。
2020/07/10(金) 08:10:39.67ID:bFyJThgA0
>>414 の質問に戻ると getchar あたりで1字ずつ拾いながら
必要に応じてバッファを拡張する方法になるのかねぇ。
%s の機能だけなら空白と空白以外だけ考慮すりゃいいわけで。

ロケールまで対応させるとこれまた大変そうだけど。
2020/07/10(金) 08:22:02.59ID:a7Xsl7M10
>>485
入力した文字列を何に使うのか次第だろう。
入力すること自体は手段であって目的ではないのだから。
オンメモリに全部展開しないといけない用途なのか?
ハッシュを求めるために計算済みの値は捨てていいのか?
暗号化のために一定のブロック長があればいいのか?
適した方法はそれぞれ異なる。
んでその当初の質問の答えは既に出てるし。
2020/07/10(金) 09:04:58.78ID:lyRh4kcU0
「getchar あたりで1字ずつ拾いながら」
ってことを経た後でないと scanf を正しく使うのは難しいんじゃないかな。
488デフォルトの名無しさん (アウウィフ FF09-jFjK)
垢版 |
2020/07/10(金) 11:08:56.61ID:2/CcitmbF
>>480
>scanfの使い方の話をしてたんだよ
>そこへ付いて来れないからって他の関数を使えと話を逸らしに来たやつがいて
>アホつったら何の説明もなしにfgetsとsscanfを使うのが正しいと強弁する別のアホが来た

ここだけ読むと >>480 がただのアスペでコミュ障にしかみえない
2020/07/10(金) 11:21:34.56ID:qqWcHkmP0
>>488
実際そうかなと思うよ。他の人の話の興味が移ってきてるのにじずんの言いたいことが正しい
2020/07/10(金) 11:22:21.30ID:qqWcHkmP0
途中で書き込んでしまった。
自分の言いたいことが正しい、他のことを話す奴は理会できてないって思考なんだろう。
491デフォルトの名無しさん (アウアウウー Sa09-Sz3q)
垢版 |
2020/07/10(金) 11:37:03.81ID:g0Z+ZvbJa
めんどくせえから GNU のライブラリにある getline() でも使っとけよ。
1行がどんなに長くてもメモリが許す限りどんどん読んでくれるぞ。
2020/07/10(金) 11:47:09.11ID:MPjC4RwwM
関数を呼び出す側が、使用するメモリの上限をコントロールできないというのは
それはそれで微妙にリスク
493デフォルトの名無しさん (アウアウウー Sa09-Sz3q)
垢版 |
2020/07/10(金) 12:00:38.40ID:g0Z+ZvbJa
じゃあfgets()で。
2020/07/10(金) 12:23:02.32ID:y8IP2wTs0
誰にも迷惑かからないところでどう使おうかは自由だな。
2020/07/10(金) 12:23:50.72ID:d1dEL6aU0
>>488
ここは技術板だ
アスペの話がしたいカナーはメンヘル板か医者板へ逝け
2020/07/10(金) 12:26:34.82ID:a7Xsl7M10
>>495
scanf の使い方の話は終わってね?
議論したい点として何が残ってるの?
2020/07/10(金) 12:28:13.10ID:d1dEL6aU0
>>496
あんたに何の権限があってそんな命令するんだよ
余計な口だしはしないでもらおうか
2020/07/10(金) 12:28:33.38ID:6/cNdm0nd
入門書でscanfを扱うのが適切か否か
499デフォルトの名無しさん (アウウィフ FF09-jFjK)
垢版 |
2020/07/10(金) 12:31:35.35ID:2/CcitmbF
getchar()からが良い
scanf()は反面教師
2020/07/10(金) 12:32:24.53ID:6/cNdm0nd
数値入力にたどりつくまでえらい大変だな
501デフォルトの名無しさん (アウアウウー Sa09-Sz3q)
垢版 |
2020/07/10(金) 12:45:54.18ID:Y8Yy4fdKa
まあ、scanf()の%sだけが問題なんだよな。
2020/07/10(金) 12:47:54.13ID:d1dEL6aU0
>>499
人の話を完全に無視して同じことばかり呟き続けやがって
ほら、どでかいブーメラン返してやんよ
> アスペでコミュ障
2020/07/10(金) 12:55:06.27ID:qqWcHkmP0
>>498
入門書のプログラムは基本的に使うのは読者本人だから、お手軽な入力処理として使うのはありだと思う。ただ、使い方の注意点は簡単に補足しておいてほしいかな。知らずに、固まった!バグだ!とか騒いだりしないように。
それと、入門書の時点で堅牢な入力処理なんて必要ではないけど、将来的に実用的なプログラムを作るときには必要になってくるということを触れておいてほしい。
2020/07/10(金) 13:37:44.03ID:d1dEL6aU0
>>500
ほんこれ

連中はこの指摘に答えられない
だからレスがない
505デフォルトの名無しさん (JP 0H93-4zP6)
垢版 |
2020/07/10(金) 13:40:12.53ID:pQ428/DjH
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン(画像有り)
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

☆ VMを書いた(C#) * x86ではない!
ttp://up.x0000.net/files/TSimulang.zip
☆ malloc / free を実装してみた (C#)
ttp://up.x0000.net/files/TMallocTest.zip
2020/07/10(金) 13:54:36.12ID:cHuUURyg0
俺に聞け! ってだけで
回答するとは言っていない
2020/07/10(金) 14:21:32.04ID:/uHfdbTha
確かに>>1の概要欄にも答えるとは一文字も書かれて無いw
2020/07/10(金) 18:44:30.98ID:d1dEL6aU0
そこへ逃げるかwww
2020/07/10(金) 18:55:09.14ID:rYXxVyEBM
>>508
逃げるもなにも、scanfの話なんて出尽くしてるじゃん。
他になにを話したいの?
役に立たないことブツブツ言ってないで話を振ればいいじゃん。
2020/07/10(金) 19:00:44.43ID:7RoGj1wV0
言い出しっぺの法則
2020/07/10(金) 19:19:20.65ID:Y3MlsMegH
>>491
そういうのが欲しくて自分で書いてしまったんですけど、すでにあるんですね…そう思う人は結構いるってことですね

>>492
getline() の中の malloc() が失敗したことがわかるんだったら、私は問題にしないですね
2020/07/10(金) 22:08:00.13ID:edpv1F1UM
>>511
QZ先生がどのくらいのリスクを前提に言っているのかにもよりますけど、
上限なき malloc については、リスク回避の点で、私はやっぱり問題にしたいですねえ。

おっしゃる通り、malloc が失敗を返した場合は概ね問題ないと思うのですが。
逆に malloc が成功を返した場合はどうです?
共有リソースとしてのメモリを奪いきってしまった結果としての成功であるなら、
OSによっては、他のプロセスのメモリ確保失敗に伴う致命的エラーを誘発するなどして、
広範囲な問題を引き起こすやもしれません。

先人の知恵として、システムコールやAPIの仕様として、インターフェイスにせよ、内部的にせよ、上限を設けてあると思います。
getline の内部は見てないのですが、極端に大きなサイズになりそうなら、malloc を呼び出す前に、
上限値を超えました的なエラーを返すような、慎重なコーディングになっていることを期待したいところです
2020/07/10(金) 23:07:47.23ID:HDImBgbn0
>>511
実行環境に固有の特殊事情ではあるけど
Linux だとメモリが足りなくても malloc が成功する場合がある。 (オーバーコミット)
malloc の返り値を気にしても無駄。

想定以上の巨大な行の読み込み (メモリ割り当ての失敗) に対して
何か対処する機会なくプロセスごと殺される (OOM Killer) かもしれないので、
想定する上限があるなら設定できて欲しいよ。
514デフォルトの名無しさん (ワッチョイ 2301-LRpg)
垢版 |
2020/07/11(土) 00:41:24.74ID:UdJEarb20
ドライバレベルの仕様に詳しい人って、そこそこ不幸だよね😅
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況