C言語なら俺に聞け 158

■ このスレッドは過去ログ倉庫に格納されています
2021/12/25(土) 12:11:46.61ID:xxeaCAplM
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C17
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

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言語なら俺に聞け 157
https://mevius.5ch.net/test/read.cgi/tech/1624846971/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/01/06(木) 15:33:37.60ID:soGE7KAW0
文字配列なんですが

char str[] = { 'A', 'B', 'C' };

↑のstrにはnull文字は付加されないという認識で合ってますか?
2022/01/06(木) 15:39:28.79ID:XZjVJACa0
('A')
2022/01/06(木) 15:50:14.25ID:OD+qNx/80
付加される保証がない、かも
2022/01/06(木) 16:43:04.90ID:NntPX0Am0
>>40
合ってる
境界調整の結果として'\0'のように見える
詰め物が入る可能性はあるが騙されてはいけない
2022/01/06(木) 16:53:16.90ID:soGE7KAW0
>>41-43
そうなんですね
ありがとうございました
2022/01/06(木) 16:54:16.61ID:U9j/lfCJ0
>>40
付加されない。
"ABC" と書いた場合に char 四個ということになるのと違ってその場合には要素が三個の配列と解釈されることが保証される。
つまり str の型を言うなら char[3] ってことね。

ちなみに

char str[4] = {'A', 'B', 'C'};

というように書いた場合 (初期化子に書かれている要素が配列の要素数より少ない場合)
は足りない分は 0 が補われたかのように動作することが保証されるので str[3] には 0 が入ってる。
2022/01/06(木) 17:05:22.56ID:OD+qNx/80
分かって使うのは良いけれど
そのまま文字列処理関数に渡すと
困った事が起きるんだよな
47デフォルトの名無しさん (アウアウウー Saa3-lUoQ)
垢版 |
2022/01/10(月) 23:16:11.54ID:rD3Qvv+7a
プログラミングで y = 1 / (1 / x) ってやったらどうなるの?
https://mi.5ch.net/test/read.cgi/news4vip/1641823457/

1 名前:以下、5ちゃんねるからVIPがお送りします 投稿日:2022/01/10(月) 23:04:17.072 ID:expyRxlYa
頭のいいコンパイラなら y = x にしてくれるのか?(機械語にするとき)

あっ、ちなみにインタプリタ言語やLLでは普通に t = (1 / x) を計算して y = 1 / t にするだろうそりゃ
うちは自動車メーカーだからな、使ってるのはC言語で、コンパイラは GHS MULTI っていうお前らが知らないコンパイラだよ
2022/01/11(火) 01:08:21.74ID:Q8SCQHSH0
xが整数ならしてくれないよね
浮動小数点数なら
if (x==0) y=NAN; else y=x;
にしてくれるのかなぁ
2022/01/11(火) 01:38:43.94ID:2o/IB+MZ0
0除算とかオーバーフローはプログラマが考慮してくれるんじゃないのかな?
2022/01/11(火) 02:04:19.39ID:Wr4lWyid0
gccなら-ffast-mathを付ければy=xになるはず
ieee754準拠なら変形しない
2022/01/11(火) 08:27:46.21ID:3vsFi49bd
整数型なら0除算が未定義動作だから変な最適化がかかるかもしれん
x==0 で未定義動作
2回目の割り算で x!=1&&x!=-1で未定義動作

signedなら最終的にy=xになりうる

unsignedならx=-1がありえないのでy=1になるかもしれん
2022/01/11(火) 19:52:42.66ID:pJ1mRDMY0
整数前提
カッコついてるから (1/x) まで評価してソレを整数化とり得る値は符号付きで-1,0,1,<0割未定義>
その評価値が分母に 分子が 1 の演算で 符号付きで 1,-1,<0割未定義>
ほとんど0割未定義を踏みそう
2022/01/11(火) 20:03:51.62ID:W/ZD5G+Pd
未定義は「相手せんでいい」だからな
54デフォルトの名無しさん (アウアウキー Sa53-TNZs)
垢版 |
2022/01/15(土) 17:45:56.79ID:MXtcLzFoa
ものにもよるがだいたいはダメだな。
printf()で%.3sみたいなフォーマットにするとかstrncpy()で文字数指定するとかなら大丈夫だろうが。何れにしてもプログラマーが意識してないといけない。
55デフォルトの名無しさん (アウアウキー Sa53-TNZs)
垢版 |
2022/01/15(土) 17:47:19.94ID:MXtcLzFoa
ぐはっ
リロードしても出てこなかった書き込みが沢山出てきた
2022/01/16(日) 13:28:18.74ID:E45iSBlB0
C言語学び始めたんだけど今のところJavaで自動でやってることをCは明示的にやってるって事くらいしか分からん

Cはガベージコレクタが無いからアルゴリズムを学ぶには最適って聞いたんだがいまいち理解できん
メモリの確保と解放を任意にできることで他と違って何ができるようになる?
2022/01/16(日) 14:08:25.07ID:H6PAG9rn0
何で?
確保した資源を解放するという当たり前のことを
自動でやってもらうことの何がそんなに大事なの?

当たり前のことがどうなっているのか把握するほうが大事だと思うけど
2022/01/16(日) 14:13:24.52ID:3oi0BVHh0
別に何も
Cはよく高級アセンブラと言われるくらい低級なもの
JavaはVMで動かす高級なもの
高級なものは低級なもので実現されてるのよ
2022/01/16(日) 14:24:28.62ID:H6PAG9rn0
マジで意味わからん
何が言いたい?
60デフォルトの名無しさん (ワッチョイ 6e24-76Y4)
垢版 |
2022/01/16(日) 15:21:59.54ID:sWhCnDyn0
int __cdecl main(int argc, char** argv)
この時二つの引数はどの時点で突っ込まれるのでしょうか?
引数とかって言われてもこのくらいしかわかんないです。
int add(int a,int b){return a+b;}
int main(){cout<<add(1,2);}
__cdeclあるときはmainの中身が実行される前にmain内にある二つの引数を・・・
すみませんよくわからないので教えてほしいです。
2022/01/16(日) 15:47:09.71ID:3oi0BVHh0
>>60
そりゃmain()が呼ばれる時だけど
何が疑問なのかよくわからん
そのadd(int a, int b)もadd(1,2)と呼ばれた時にaに1、bに2が入る
それと同じ

>>59
>58は>56への応答だよ
62デフォルトの名無しさん (ワッチョイ 6e24-76Y4)
垢版 |
2022/01/16(日) 15:55:52.82ID:sWhCnDyn0
>>61
ありがとうございます。
c++やり始めたばかりで、初めて__cdeclというものに出会い、
main()に引数が指定されるのも初めて見ました。
__cdeclを調べてみたのですが、よくわかりませんでした。
https://docs.microsoft.com/ja-jp/windows/win32/winsock/complete-client-code
ここのコードに出てきたやつです。
argc, argvこの二つにはどこから来た値がどのタイミングで入るのかがよくわかりません。
サーバー側の方でそれぞれの構造体や関数は一応ですが、調べました。
(ディスクリプタが良くわかんなかったけど部品の形状みたいな感じで覚えました)
63デフォルトの名無しさん (ワッチョイ 6e24-76Y4)
垢版 |
2022/01/16(日) 15:57:48.95ID:sWhCnDyn0
main関数が一番最初に読み込まれる関数という風に思っていて、
includeやdefineを済ませた後に一番最初にmainが実行されるのなら、
argc, argvこの二つの変数の値がどうやって決まるのかわからないのです。
64デフォルトの名無しさん (ワッチョイ 6e24-76Y4)
垢版 |
2022/01/16(日) 16:00:01.63ID:sWhCnDyn0
今更なのですが、mainを実行するときにmainの中の
ローカルな空の変数(?)を宣言するだけ宣言しといてるとかですか?
65デフォルトの名無しさん (ワッチョイ 02ad-bpA4)
垢版 |
2022/01/16(日) 17:07:18.79ID:rX32u5GR0
>>63
OSから引き渡される。普通はコマンドラインの引数をシェルが加工して渡してくる。
OSのない組み込みのようなやつの場合はそのmain()を呼び出すプログラム次第になる。
66デフォルトの名無しさん (ワッチョイ 02ad-bpA4)
垢版 |
2022/01/16(日) 17:11:54.22ID:rX32u5GR0
>>64
何を疑問に思っているのかよくわからないが、Javaとか他の言語とほぼ同じでmain()に限らず関数は呼ばれたらそのブロック内でローカル変数のメモリを確保する。(ただしCの場合は宣言だけだと初期化されない)。
67デフォルトの名無しさん (ワッチョイ 6e24-76Y4)
垢版 |
2022/01/16(日) 17:30:57.83ID:sWhCnDyn0
>>65
ありがとうございます。
OSからもらってくるのですね。
謎が解けました。
2022/01/16(日) 18:32:43.61ID:E45iSBlB0
>>57
>>58
自分でメモリの確保と解放を行う事でメモリの仕組みを知れるのは大事なのは分かる

ただgcが動かない事でアルゴリズムとどう繋がるのかがイマイチ分からん
連結リストはメンバを参照して動的配列実現してるけどgcは関係ないと思う
gcが動かない事で何かメリットないん?
2022/01/16(日) 19:07:47.21ID:8yj7aXgd0
純粋にアルゴリズムを学ぶことが目的ならC以外のぬるい言語のほうが良いのでは?
ただ、考えたアルゴリズムを誰よりも早く動かしたいならCは役立つと思うよ
2022/01/16(日) 20:55:00.02ID:qRjB4bc50
純粋に、なら pascal でしょう…
pasca から C へは機械的に書き換えられるから C でもいいでしょうが

それ以上の高級言語になると、例えばソートアルゴリズムの「インプレイス」の概念も有耶無耶になってしまうので、初等アルゴリズムくらいは C で勉強したほうがいいですね
2022/01/16(日) 20:57:35.96ID:YLrls7710
メモリーリークなどは、痛い思いをしてでも学ぶ価値はあると思う
根性論ですまん
2022/01/16(日) 20:58:56.40ID:uYZKVP770
>>68
プログラマの望むタイミングでGCができるというメリットがある
GCが動くとどうしても遅くなるので
その遅くなると時をプログラムで決めることができる
2022/01/16(日) 23:05:47.94ID:YLrls7710
確保と解放はDB扱うときにもあるからね
2022/01/17(月) 00:45:04.90ID:VBYSAUJW0
rustがCの代替になる理由がメモリ関連のバグが減るからってのはどう言う事?
2022/01/17(月) 00:56:25.55ID:jU2WrI4n0
オブジェクトは複雑に依存関係が出来る場合もある。
参照 (C 的に言えばポインタ) が残っているのにオブジェクトの寿命が尽きていればダングリングが生じてしまう。
C では寿命の管理をするのはプログラマの責任であって、無効なポインタを使った結果は未定義。
そういうのを静的にチェックしてエラーにしてくれたらありがたいなぁというのを実現したのが Rust 。
そのかわり制約の記述がちょっと面倒くさくはあるんだが、どちらにせよ依存関係の管理は C でもやってたことではあるからね。
Rust で制約を書けないようならたぶん C でもちゃんとメモリ管理できてない。
2022/01/17(月) 02:01:49.66ID:4l2NkMK40
Ubuntuのgcc9で

size_t i = -100;
printf("%ld\n", i); // -100

と出力されたんですが、なぜsize_tで負数が扱えるんですか?
stddef.hでは

typedef long unsigned int size_t;

になってました
怖いです
2022/01/17(月) 02:09:51.98ID:jU2WrI4n0
>>76
扱えていない。
printf の書式指定と実際の型に不整合がないようにするのはプログラマの責任で、
それができていないときにどういう挙動になっても知ったことじゃない。
2022/01/17(月) 02:13:20.92ID:4l2NkMK40
>>77
printfですかなるほど
2022/01/17(月) 02:32:10.74ID:4l2NkMK40
>>77

あと

size_t n = -100;

if (n == -100) {
puts("-100");
}

これが真になるのは-100がsize_tに暗黙的にキャストされてるせいですかね
2022/01/17(月) 06:34:55.39ID:J3jxIzMN0
>>68
gcって思考放棄だろ
資源管理の中でメモリだけ後片付けを特別扱いできたからって何ってこと
資源管理にはアルゴリズムがいらないと思うのか?
2022/01/17(月) 08:24:31.68ID:y6/SFoBh0
>>76
-100は32bit 2の補数表現で0xFFFFFF9Cになる。
これはunsigned longで4294967196に相当し、符号なしのiにはこの値が入ってる。
ただprintfの指定が%ldと符号付きになってるので0xFFFFFF9Cを符号付きで表示したらやっぱり-100になる。

>>79
-100がsize_tに変換されるのではなく、どちらの値域も含めることができるように両辺がlong long intに拡張される。
2022/01/17(月) 08:24:40.15ID:6BYLlYWJd
>>79
signed longかsize_tかどっちかに暗黙的にキャストされる
-Wallすると警告出るだろうけど
2022/01/17(月) 13:06:53.33ID:RA8YXgQS0
サイズがおっきい側にあわせて拡張されるけど
拡張の際に符号付で拡張されるかは、拡張される側の型による でいいのかな?
左辺が size_t で 右辺が (__int16)-1 と (unsigned __int16)0xffff とで変わってくる
2022/01/17(月) 19:03:14.06ID:4l2NkMK40
>>81
なるほど、わかりました
ありがとうございます

>>81-83
比較の計算のために型を合わせるってことですね
納得しましたありがとうございます
2022/01/17(月) 21:09:27.93ID:VBYSAUJW0
>>80って>>57
よく分からん話し方が似てる
2022/01/18(火) 07:11:42.98ID:gNdHIxeHd
おまえさん、匿名掲示板に向いてないな
2022/01/20(木) 11:09:59.27ID:3tZE3jDgH
#defineの効果を全体に適用させる方法は無いの?
書いてあるヘッダを取り込まなくても
2022/01/20(木) 11:14:24.09ID:hwIlnS+y0
コマンドラインで指定
2022/01/20(木) 14:48:47.15ID:n7chvAG30
>>87
ヘッダに書かないメリットは何?
暗黙の効果があると全体の見通しが悪くなるだけだと思うんだが
2022/01/20(木) 16:57:56.31ID:JLPh4iSLd
gcc -DUNKO
とかでコンパイル時分岐させるのはよくやる
これで "#define UNKO" 相当
2022/01/20(木) 17:35:43.55ID:JsGuh7u5K
>>90
細かいツッコミだが、
> これで "#define UNKO" 相当
"#define UNKO 1" 相当な
2022/01/20(木) 18:12:26.02ID:Eie73JRu0
この問題なんで答え0なん?
難しいhttps://i.imgur.com/TelzwbB.jpg
2022/01/20(木) 19:26:05.14ID:8odJS2DdM
%rbp の値を pushq でスタックに退避して他の処理をやって popq で下ろしてきてるから最初に入ってた 0 が出てくる
2022/01/20(木) 19:30:17.07ID:6OdGtD3E0
>92
なんか80286〜80486時代に見たアセンブラと違うorz


適当にググった予想

;レジスタ %rbp、%rbx の値をスタックにコピー
pushq %rbp
pushq %rbx

...

popq %rbx
popq %rbp
;コピーしておいた値を%rbx,%rbpに戻す

呼び出し前と同じ値になるだけだね。
2022/01/21(金) 00:21:23.88ID:3gUGA9pL0
>>92
0の入った%rbpをpushqして最後にそれをpopqして%rbpに戻しているから。
pushq, popq の数は合っているので他の値にはならない。
2022/01/21(金) 06:05:07.87ID:mAmuRLc0a
>>89

ライブラリの中なんで書き換えるのはちょっと
2022/01/21(金) 06:13:28.12ID:mAmuRLc0a
マイコン系のやつでヘッダのインクルードする前に
マクロ定義すれば使うピンを選択できるようになってるはずなんだけど

当然ながら別にコンパイルされるソースの中には効力がないと
2022/01/21(金) 07:37:29.62ID:hGKgCtXH0
「マクロ定義すれば使うピンを選択できるようになってる」メーカー提供の何かを使った
自前のライブラリで なんとかしたいと?

それライブラリの設計ミスじゃね?
2022/01/22(土) 12:31:56.24ID:90hTt9580
日立の悪口はやめろ
2022/01/23(日) 06:37:18.36ID:Li0julahd
ライブラリはコンパイル済みだから#defineしても無駄だろ
2022/01/26(水) 09:09:47.27ID:iLK8Wqk90
>>75
Rustは間違いがあるとコンパイラが色々指摘してくれる点でいいよね
例えばこの部分にこういうメモリの安全でない使い方をしていますよ、とか
ここにこんなデータ競合が発生していますよ、とか
2022/01/26(水) 09:32:17.82ID:Ppmaq+BpM
メモリ管理って言っても大層なことしないけどな
単一コンテキストなら対照的にctr/dtr置けばいいし、複数コンテキストならリンクリストに繋いでrefget/refputでいいし
まあメモリ上限やフラグメント、メモリプールとかやり始めるとなかなか面倒になってくるけど…
2022/01/26(水) 21:10:17.71ID:z6fCP1j50
Cのサーティファイ3級の問題集で
int main(void){
int i,j;
for(i=3, j=10;i-->0 && j-->0;);
printf("iは%d.jは%d\n",i,j);
return 0;}
でiが-1 jが7になるのはどうしてでしょうか?
2022/01/26(水) 21:34:45.68ID:4bRyoani0
>>103
i-->0 && j-->0が偽になるのはi==0, j==7のとき
iはi--で-1になってjの方は短絡評価でj--が評価されずにj==7のまま
2022/01/26(水) 21:37:25.63ID:94PZZUq60
課題や問題としてはアリなんだろうけど、こういうコードはキモいよなぁ
2022/01/26(水) 21:41:05.71ID:R08bxH5q0
ルールを知ってるか?という問題に
実用上どうのと言ってるやつ
わからんから負け惜しみにしか聞こえんぞ
2022/01/26(水) 21:44:03.93ID:zNP9VNXb0
条件に副作用がある式を書くと糞コードになるよ、って例かな
2022/01/26(水) 21:48:11.38ID:z6fCP1j50
>>104
ありがとうございます!大先輩! _(._.)_
2022/01/26(水) 21:49:35.56ID:R08bxH5q0
関数ポインタを使っただけで糞コードと言い出すやつと変わらんな
2022/01/26(水) 22:02:05.94ID:iLK8Wqk90
偶然だけどRustがCから唯一受け継がなかったのがfor(;;)文と前置/後置の++と--だね
Rustではfor(;;)の代わりにもっとわかりやすいイテレータを使うfor inになって
イテレータ利用で++と--を使う場面が激減したため +=1と-=1で十分となった
2022/01/27(木) 08:19:14.30ID:1WN6znb60
#include <stdio.h>

void main(){
 int a[5];

 printf("%d\n", &a[0]);
 printf("%ld\n", &a[1]);
 printf("%d\n", &a[2]);
}

結果:
1860819792
140735054207828 ←★
1860819800

1860819796になるところがprintfで%ldにすると★のようになりました。どうして?
2022/01/27(木) 08:40:51.15ID:hGoB7Zi60
%dはint、%ldはlong
LP64環境(Linux等)なのだろう

ってか、ポインタを%dや%ldで出すのが変なんだけどね
%pで出しましょう
2022/01/27(木) 09:28:40.94ID:Fupo2oO/d
挙動がわかっててやるのはともかく
なんで?になるのはギルティだな
担当教官が
2022/01/27(木) 11:12:04.00ID:HehBpiSx0
++は、アセンブラコードを意識していると思うよ
2022/01/27(木) 12:53:54.43ID:cK3g3Gve0
>>114
大昔はコンパイラが直訳だったからね
今はコンパイラが賢いからx++でもx+=1でもx=x+1でも同じ結果
さらにアセンブラ側もレジスタを介すinc命令ではなくメモリ上に直接add 命令で1加算とか
そもそもポインタの++なら対象の型が8/16/32/64bitに応じて1/2/4/8をaddとか
だからアセンブラは今は関係ないし言語としても++がなくても影響なくなってしまってる
2022/01/28(金) 07:31:33.24ID:Tsd33EHWd
ポインタから次々読んでいく場合
a=*(p++);
のほうが便利
2022/01/28(金) 07:43:00.03ID:y3i0lS6h0
格好つけるダサいやつ
2022/01/28(金) 08:12:12.92ID:LR3qN1W70
一種のイディオム化しているがふつうその括弧はつけないな。
2022/01/28(金) 08:17:06.42ID:2Fs3iqwoM
まあ、あっても悪さしないし心配なら付けるのは正しいと思う
>>118の言う通りよく見るイディオムになってるので違和感はあるけど
2022/01/28(金) 08:25:24.42ID:D0DTDHxMd
char *src, *dst;
while(*dst++=*src++);

みたいな書き方はよく見るけど
最適化とか存在しない古いコンパイラのための書き方だよなといつも思う
2022/01/28(金) 09:16:27.33ID:grc2q108d
いい意味の面倒くさがりだよ
2022/01/28(金) 09:23:04.37ID:Tsd33EHWd
最適化だけの問題ではないぞ

while(*dst=*src){dst++;src++;}

では変数名を変更する必要が出た場合2ヵ所づつ書き換えねばならない
→ミスにつながる

それにループが終わった後でdstとsrcは最後の要素を指しているので余計なインクリメントが要るかもしれない
123デフォルトの名無しさん (ワッチョイ a510-Y4FF)
垢版 |
2022/01/28(金) 11:00:14.06ID:yXxqNK5h0
初心者や他言語ばっかりやってた人の誤読回避は考慮する?
124デフォルトの名無しさん (ワッチョイ eaad-dw97)
垢版 |
2022/01/28(金) 11:17:11.26ID:udo1auGz0
この頃発見した printf() のフォーマット

% の後に # を付けると x 変換の時に頭に 0x を付けてくれると知り、早速こう書いてみた。

printf("%#x\n", 0xab);

0xab が出力される。

これはいい、と思い16進4桁出そうとしてこう書いた。

printf("%#04x\n", x);

すると 0x は付いたがその後が2桁になった。どうやら 0x の部分の桁数も含めなければいけないようだ。仕方がないのでこう書き直す。

printf("%#06x\n", x);

やった!できた!

しかし幸せは長くは続かない。やがて x に 0 が入った状態でここを通過。以下の出力を得る。

000000
2022/01/28(金) 11:22:43.44ID:dRbZojn90
Cは初心者向けではないし、可読性は考慮していない
やりたい事をさっとコード化出来る人に向いている言語
2022/01/28(金) 12:25:59.28ID:6cofCgvGM
>>124
そんなフラグ初めて見たけど、仕様見たら確かに0以外の時に0xを付加するんだな
いまいち使いづらい
2022/01/28(金) 12:32:45.35ID:obJ/SPWt0
文字列のエスケープシーケンスでバイナリ直接したんだけど、例えば"\x10"の後に"a"という文字を続けようとして"\x10a"って書くと値が大きすぎるってエラーになる。
"\x10" "a"と分割するしかない?
2022/01/28(金) 12:35:51.06ID:grc2q108d
Cはプログラマを信頼する言語だ
悪いことをさせない制限より
自由度を優先させている

怠けるやつより進歩する者を優先するのもしかり
2022/01/28(金) 13:19:26.12ID:vyOOr9LZM
>>127
> "\x10" "a"と分割するしかない?
それしかなさげ
8進表現は最大3文字となってるから "\0123" は '\012' と '3' になるけど16進表現には桁数の制限がないので "\x10a" を1文字に解釈しようとしてエラーになる
char * の文字列は2文字、wchar_t の文字列は4文字までにすればいいと思うんだけど
2022/01/28(金) 13:57:54.02ID:obJ/SPWt0
>>129
ありがとう。やっぱりそうなのね。
ESCシーケンスが書きにくくてしょうがないわ。
2022/01/28(金) 16:18:28.78ID:hT9TavA00
>>127,129
マイクロソフトのドキュメントにも言及があるのを見つけた。
https://docs.microsoft.com/ja-jp/cpp/c-language/octal-and-hexadecimal-character-specifications?view=msvc-170
不格好だけど C はそういうもんだからしょうがないね。
2022/01/28(金) 16:49:19.01ID:obJ/SPWt0
>>131
わざわざ調べて頂いてありがとうございます。
 #define ESC_UP "0x1b" "A"
のようにマクロで逃げることにしました。
使う側では
 printf("今からUP" ESC_UP "UP完了");
と少し気持ち悪いですが。
2022/01/28(金) 17:55:44.80ID:sJpZ8snBM
ESC しか使わないなら
printf("今からUP\033AUP完了");
とかでもいいかも
今更8進数かよって感じもするけど…

もしくは
#define ESC(c) "\x1b" #c
printf("今からUP" ESC(A) "UP完了");
くらいかなぁ
134unko (ワッチョイ eab9-21ac)
垢版 |
2022/01/29(土) 18:53:20.85ID:cvNc/NLr0
ごめんなさい高校のc言語の課題で乱数とじゃんけん対決をして結果と手を動的配列に格納して最後にまとめて結果を表示するというやるをやってるんですが
whileループで代入した結果とその後のforループでカウントしながら表示している値が違うみたいでずっとプログラム見てても何が原因なのか分からないのでわかる方いたら教えて欲しいです.
https://github.com/unko-c/kadai/blob/main/kadai.c
2022/01/29(土) 19:18:32.81ID:mAwlWFlr0
>>134
scanfで表示出力は出来ません。分けましょう。
printf("times: "); scanf("%d",&j);

しかし、それでもまだ問題がある。
2022/01/29(土) 19:22:51.55ID:wjo4lb340
44: どっから配列が出てきた

デバッガ使えばプログラムの動き見るの捗るから使え
使えないなら怪しそうなとこにひたすらprintfを埋めろ
2022/01/29(土) 20:13:03.39ID:mAwlWFlr0
(&janken->man)[i] = man;
printf("man:%2d ",(&janken->man)[i]);

構造体配列のメンバーアクセス方法が間違ってる

case 0:
  countDraw++;
この直後にはbreak;を入れること(全てのcase文に適用)

while(i<=j && man<=2 && man>=0) {
ここにmanを入れる意味は?
入力範囲チェックを意図するなら、ここではなく
scanf直後に、範囲外ならcontinueさせる方が良い

無駄もあるけれど、この辺を直せば動くんではないか?
138unko (ワッチョイ eab9-21ac)
垢版 |
2022/01/29(土) 20:51:58.61ID:cvNc/NLr0
>>137
ありがとうございます
break;忘れてたので実行結果変でしたね
ポインタとかは最近やり始めてまだよく分かってないのでちゃんと勉強しておきます
139unko (ワッチョイ eab9-21ac)
垢版 |
2022/01/29(土) 20:54:58.88ID:cvNc/NLr0
>>136
一応whileの直前当たりでかろっくで配列確保してます
2022/01/30(日) 01:38:43.74ID:05k5AmyC0
44: (&janken->man)[i]
janken->man は配列ではない。
jankenは配列とみなせるポインタだが関係ない

たぶんコンパイルを通すためにこの形になってるんだろうけど
janken[i].man とするべき
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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