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/06/29(月) 19:31:22.68ID:JUEjBXx8d
EDLIN
400デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/29(月) 19:59:21.99ID:x9/2kcfz0
>>398
C言語を何に使うかによって全然違うと思うけど
2020/06/29(月) 20:00:40.16ID:JUEjBXx8d
何に使うかでそんなに変わるか?
2020/06/29(月) 20:03:09.44ID:6d9dL1u1a
C言語でエンドルフィンの造出をアヘアヘ
2020/06/29(月) 20:05:23.72ID:w+wTil7e0
>>398
コンパイラ:cygwin の中の mingw32
エディタ:xyzzy
あと cygwin の make
2020/06/29(月) 20:13:09.53ID:o6pktO+O0
学習用途で ideone や codepad 規模で済むなら Webブラウザ
2020/06/29(月) 20:21:56.62ID:TPMqgpKl0
>>398
VisualStudioCodeの統合ターミナルでWindows10のWSL2利用
参考として>>394の環境は以下の通り
https://i.imgur.com/uDwONkZ.png
2020/06/29(月) 20:23:46.01ID:vApDDB4S0
>>398
OS: Windows10
コンパイラ: gcc と clang (msys2 の pacman で入るやつ)
       その他に Open Watcom C とか LCC (LSI-C じゃなくて Little C Compiler ね) とか
エディタ: Emacs
407デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/29(月) 20:24:01.34ID:x9/2kcfz0
初学の時、H8に書くとき、arduinoに書くとき、それぞれ全部違ったわ。
2020/06/29(月) 21:14:11.50ID:Gzb8Tiox0
>>398
OS:Linux(Fedora32)
コンパイラ:gcc
エディタ:vim
409デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/29(月) 21:49:44.45ID:uavgiC7w0
適切な問題とヒントが一番大事。
2020/06/30(火) 06:48:50.33ID:W+MWiusu0
>>398
秀丸
2020/06/30(火) 07:20:47.85ID:ojYrCHBE0
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
VSCode の拡張機能、Remote WSL も使う

Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、
ruby 2.6.6, node 12.16.2 を、build-essential で、コンパイルして入れた

yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。
これは、#!/bin/sh で始まるシェルスクリプト

anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える

build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています

パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
2020/06/30(火) 11:26:03.93ID:Xg3HKp34M
build-essential以外はC言語には関係ないな
2020/07/02(木) 09:18:11.06ID:1XrTO7+60
Cに限らず汎用で使える開発環境で色々やってるってことかと。

俺も基本的にはvimとmakeで何でもやる。
vimの中でとりあえず :make と打ってQuickFix機能でエラー修正。
上手く拾ってくれない時は ~/.vimrc で errorformat 変数に追加。

>>398 の人はOSも知りたいってことなので追加。
Linuxのウィンドウ環境使わないコンソールでfbterm(日本語表示用)。
ツール類はディストリビューションに入ってた奴。
2020/07/06(月) 17:38:55.00ID:6O25/+p5H
int main (void)
{ char a[256];
printf("Enter a string:");
scanf("%s", a);

(以下略)
勉強中に上のような「キーボード入力からchar型配列に文字列を格納する」という処理を見かけました
この例だと(ヌル文字含め)256文字以上の文字が入力されたときはその後の処理が正常にできなくなりますよね
現実的には値を充分大きく指定しておけば問題はないのでしょうが、入力された文字数に応じて要素数を適切に設定したりはできないのでしょうか?
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を扱うのが適切か否か
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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