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
353デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 20:57:46.41ID:YxSvZ5UV0
あ、ごめん。ないかな?でも作れなくはないか。
2020/06/27(土) 21:01:20.32ID:fF6t87uZa
>>353
代入文の言語とか
2020/06/27(土) 21:01:54.32ID:fF6t87uZa
文は値を持たないから
2020/06/27(土) 21:16:43.71ID:fF6t87uZa
代入式なら
a = b = 0:
は大丈夫だけど、
代入文の言語ではダメ(文法エラー)
卑近な例だと excelVBAとか
2020/06/27(土) 21:48:32.85ID:TsX0h7IG0
>>352
BASIC
358デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 21:54:01.50ID:YxSvZ5UV0
あ、そうだ。昔の BASIC がそれだったな。今もそうか。
2020/06/27(土) 22:14:52.03ID:8IoNpLP20
Fortranも駄目だった気がする
360デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/27(土) 22:45:34.92ID:3uU6UKGu0
iZ-Cで頑張っている方々もいる。
2020/06/27(土) 22:52:26.39ID:Fil4ka9J0
>>359
C言語以前の言語はたいてい駄目だな
例外はLispぐらいかな
362デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 23:11:39.40ID:YxSvZ5UV0
ま、しかし、本当なら代入は全く違う記号(あるいはワード)使って欲しいところではある。
昔々中学生の頃に初めてBASICのリストを見て A = A + 1 ってなんじゃこりゃと思った事あるし。
普通の数学や算数とルールが違っているのに同じであるかのような記号の使い回しで混乱w
2020/06/27(土) 23:17:49.21ID:WNNU6Y/YK
それ小学生のとき見たからすんなり入ってきた
方程式とは違うよってご丁寧に書いてあったし混乱はなかった
2020/06/27(土) 23:24:19.62ID:zYxBmbbI0
>a = b = 0:
BASICじゃ
bが0なら a=-1
bが0でないなら a=0
だっけ。
2020/06/27(土) 23:37:39.31ID:fF6t87uZa
そっか、そのとき b = 0 は代入文じゃなくて、値を持つ比較式ですね
文法は間違いでした
2020/06/27(土) 23:38:09.75ID:fF6t87uZa
文法エラーは間違いでした
でした
2020/06/28(日) 00:32:47.05ID:akwdxVh60
=は代入が比較より使用頻度が高いので、2文字(=:)が代入だと地味に面倒そう。
2020/06/28(日) 07:11:45.70ID:4OGtUBl/0
>>362
APLお勧め
369デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/28(日) 11:47:20.61ID:vGhSDCc20
iZ-Cに反応しないのは素人か。
2020/06/28(日) 17:12:13.76ID:8Xgo7zrJ0
>>368
今のAPLはつまんなくなったね
2020/06/28(日) 21:51:57.49ID:kMbOl++G0
変数名を文字列で取得したいんだけど どうしたらいいかな

printfデバッグとかで、 printf("hogehoge=%d\n",hogehoge); ってやるじゃん?
これをちょっとだけ効率よくしたいけど、マクロでどうにかならん?
2020/06/28(日) 21:54:48.80ID:Iks3cRKy0
>>371
マクロ定義のときは識別子に # を付けると識別子を文字列扱いできる。
2020/06/28(日) 22:04:34.55ID:2DMHRA/z0
#define POUT(x) printf("%s = %d\n", #x, (x))
こんな感じ?
2020/06/28(日) 22:18:47.05ID:dcZQFZ1fd
#define POUT(x) printf(#x " = %d\n", (x))
こっちの方がいいか?
2020/06/28(日) 22:53:44.96ID:HzcxpANJ0
文字列リテラルの連結は滅多に使わないけど盲点というか
わかってて使うには良いものだね
"aaaa" "bbbb" → "aaaabbbb" として解釈される
2020/06/28(日) 22:57:59.33ID:qWBhd30v0
>>375
よく使ってました
長い文字列を記述する際に
空白文字ではなく改行文字を入れてたな
2020/06/28(日) 23:05:22.34ID:sygO1Ih/0
usage表示したいときとか普通に使うわ
2020/06/29(月) 00:09:50.35ID:eubxXrdwd
私も普通に使う
379デフォルトの名無しさん (ワッチョイ 8f01-/Fs/)
垢版 |
2020/06/29(月) 01:27:56.70ID:C/fQS0GP0
viがバグるのでやめてください。
2020/06/29(月) 08:55:46.03ID:UQIGysI+0
vimはバグらないぞ
2020/06/29(月) 08:57:31.19ID:y9Ww1t9/H
もしかして: vim
2020/06/29(月) 08:58:42.61ID:nBP9TntY0
vimじゃないviには長年世話になったもんだ
2020/06/29(月) 13:35:04.89ID:rjGVLU620
>>374
書式文字列が常に同じになるケース(>>373)だとコンパイラの最適化で使い回されるようになるけど、
変数名を連結して書式文字列が場所ごとに変わっちゃうと使い回しが効かなくなるから、メモリ使用量とかファイルサイズで不利になるかもね。
前者にしても変数名そのものの文字列は別途定義されるのもあってほんの些細な違いだから、しいて言えばって程度の話だけど。
384デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:01:50.53ID:fw2IFdDxF
and が & と &&
or が | と ||
という具合に bit 演算用と論理演算用で演算子が違いますが

bit 演算の xor は ^ で
int a = 123, b = 456;
のとき a^b と描けますが

論理式の xor はどう描けばいい?
bool u = true, v = true;
のとき u^v と描いても問題無いですか?
2020/06/29(月) 15:17:39.29ID:TPMqgpKl0
(u != v) で良いのでは?
386デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:25:14.45ID:fw2IFdDxF
bool に 0 と !0 以外が入ってても大丈夫ですか?
387デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:27:23.97ID:fw2IFdDxF
もし御存じの方がいらっしゃったらで良いのですが
"u ^^ v" みたいな演算子が無い理由も知りたいです
問題後出しで済みません
2020/06/29(月) 15:37:10.60ID:y9Ww1t9/H
ビットごとのxorは暗号とかで多用するけど、
論理式のxor(一方のみ真)はめったに使わないからかと。

!u != !v が最小かな。
389デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:41:17.96ID:fw2IFdDxF
ありがとうございました
2020/06/29(月) 16:32:31.26ID:nBP9TntY0
関係演算子の結果はint型の1か0なんだから
a < 124 ^ b < 456 でもいいはず
2020/06/29(月) 17:07:26.21ID:TPMqgpKl0
C99以降のbool型(_Bool型)の値はfalse(0)とtrue(1)のどちらかしか取り得ない
変数や式の評価が0以外の場合はすべて1に変換される
評価結果の値が不明の場合はbool型にキャストすると良い
(bool)u != (bool)v
2020/06/29(月) 17:12:09.58ID:vApDDB4S0
イディオムとしては !! を付ける (否定を二回やる) というのもよく知られている。
(見づらいので良くないという意見もある。)
2020/06/29(月) 17:19:40.81ID:nBP9TntY0
!!は厨二病臭くて俺はあんまりやらないが
この程度で読みづらいとか言い出すスキル不足なやつに迎合する意図は毛頭ない
2020/06/29(月) 17:24:25.71ID:TPMqgpKl0
適当サンプルプログラム
https://i.imgur.com/OgY6Qcz.png
2020/06/29(月) 17:44:20.33ID:1Lbf5C9Kd
0, !0 意外の値が入ってた場合にどんな結果を期待するかによる
2020/06/29(月) 17:55:06.30ID:I0J8qHbO0
禅問答かよ。
2020/06/29(月) 19:26:41.50ID:xaDJZCCE0
>>395
話の流れぐらい読めよ…
>>385が成立するかどうかだろ
398デフォルトの名無しさん (JP 0Hbf-EqIm)
垢版 |
2020/06/29(月) 19:30:21.97ID:rBtTXcyIH
C言語に使ってるエディタとかIDEとか教えてください
OSとかの環境もあるとありがたい
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); // 数値 + 改行
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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