C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
実体化とか非実体化とか、オブジェクト指向の概念でしょ。
Cではリテラルに対応するエリアがあって、それをデータの入れ物にするか、アドレスの入れ物にするか、だけでしょ。
いずれにしろ変数の寿命はグローバルスコープに定義するか、静的(static)に定義しないかぎり、
使われる関数のスコープ内に限られるでしょ。 >>666
> char a; 実体化
というのを除き、だいたい合ってる
char *a;ではcharの実体は作られずに
int(&a);だけが作られる
Cの前身のBでは、*3 = 1;で
メモリの3番地に1を書き込むようになっていた
アドレス演算子もあって
auto a, b; /* 型の概念がないので記憶クラスだけ */
a = &b; /* bとして使っているメモリのアドレスを取得 */
*a = 1; /* bに1を代入 */
つまり、おまえさんの言うように整数変数を
そのままアドレスの表現に使っていた >>672
そんなものはコンパイラ次第で変わる
定数でアドレス取ってなきゃ実体を生成しないとか普通にあるし 機械語に翻訳されるかどうかは
それまでの文意や環境(特に最適化)次第だもんな ちょっとお尋ねします
ベテランとお見受けする方は
/* */
↑コメントにこれつかいますけど
//
↑何故これつかわないんですか?
なにかしらトラブルの元になったりするんですか? >>678
C99準拠を仮定できないなら前者を使わざるをえない
複数行をコメントする場合や文の途中をコメントする場合は基本的に前者を使う
行の後半にコメントを書く場合は両方使う おおおおおお
ありがとうございます
なるほどねー
そういうことですか >>678
1行コメントならもちろん//を使うが
コメントが2行以上になる可能性が否定できない場合、
毎行いちいち//が必要なのは面倒なので
/*
*/
と折り返す恰好にする
それと1行コメントは内容的に馬鹿っぽくなりやすい
なんて気持ちもちょっとある C99非準拠の環境って工場のメンテとかそんな感じっすかね >>682
も気になるな
アスキーコード "2F2F"って何かあるんですか? emacsだとコメントリージョンは/*になるからだろうな。 >>682 の話は行の最後に \ があると次の行に継続するってやつかな。
その言語仕様と Shift-JIS の特定文字との組み合わせで問題が起きる。
「表」や「能」は文末に来る可能性が高い字でしょ。 苦Cで勉強してるけど文字列がよくわからん
あれいる? ただの\0終端の文字型の配列を便宜的に文字列と呼んでいるだけ 文字列処理関数
わざわざ配列に文字列入れる意味あるのか? >>692
https://9cguide.appspot.com/14-03.html
か?
入力に scanf() 系を薦めているのは古い(fgets() を使うべき)とか問題はあるが、
内容は基本的で絶対に必要なものだ
C には「文字列型」はなく文字型の配列で扱うのは基本的な了解事項だ >>693
それ
結構重要なんだな
atoi型とかもよくわからんが >>694
atoi() は文字列の表現からint型に収まる表現に変換するもの
C では "123" と 123 を厳密に区別する わざわざ配列でやるのってprintfじゃ上書きできないから? atoi は 文字列から数値へ変換する方向
(s)printf は 数値から文字列に変換する方向 すまんよくわからん
まぁ配列の重要性はわかったけどさ 入力して下さい ?
? の二倍は---
っての作りたい またfgets厨が湧いたか
Cスレには付きものだが
誰が吹き込んでるんだかしつこさが異常なんだよな
まったく >>701
/* -*- C -*- */
#include <stdio.h>
int main()
{
int input;
scanf("入力して下さい:%d", &input);
printf("%dの二倍は%d\n", input, input * 2);
return 0;
} >>702
fgets() の方が総合的にすぐれていると思うのだが 何がどのように何に対して優れているんだ?
腐っても工学者たるもの客観的で再検証可能な主張をしてみな >>703
scanf はメッセージを出力したうえで値を受け取る関数じゃないんだ 残念ながら え?scanfは、この通り打ち込まないと認識しないよって事だろ? >>701 のは 入力して下さい も含めて入力を要求してたのか
こりゃ失礼 >>701
#include <stdio.h>
int main(void)
{
int n;
char buf[32];
printf("入力して下さい:");
fgets(buf, sizeof(buf), stdin);
n = atoi(buf);
printf("%dの二倍は%d\n", n, n * 2);
return 0;
} >>705
scanf() はバッファオーバーランの温床
scanf("%s"); と何気なく書いてしまうとアウト
最初からバッファサイズを意識しなければならない fgets() の方が教育的 それ都市伝説だから、単に使い方間違えてるだけだから!
フィールド幅をちゃんと指定すればscanf系でも安全だよ?
まぁ、エラーメッセージの都合上fgets使うかもだけど。。。 gets_s()やscanf_s()を使えば済む話に思えるが 言いたいことは分かるなぁ
printfだって使い方間違えればフォーマットストリングで死ぬしな >>712
そのフィールド幅の設定にマクロを使って指定できない,ハードコーディングの形になってしまう
これでは確保側との連携が取れない C言語はアセンブラのラッパー言語だから、そう言うもんは各自が気を付ければいいのであって、へんな関数量産すんな。 m修飾子はscanf()の中でバッファの確保とポインタ代入をしてくれる、か。
使用者側がバッファを用意して容量はこれだけ、と言明するのとはちと違うね。
実用だと書式文字列をsnprintf()か何かで生成する手かなぁ。 >>718
文字数制限したい場合は %3mc のように c を使うとできる。メモリ確保は相変わらず scanf() 側でやるので後で free() が必要であることには変わりがないが。
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/scanf.3.html >>711
くだらんなあ
%sのためにわざわざscanfなんぞ使う珍獣の話しかできんのかおまえは >>721
この話の発端のとあるC教育サイト
https://9cguide.appspot.com/14-03.html
では
scanf("%s");
を使っちまっている
珍獣というほどのものではないのでは?
禁じ手をやってしまう scanf() は悪 >>720
所有権をうんぬんするようなところ、たとえば malloc() したところで free() する、という教義のもとでは使うのに抵抗があるかもしれない、
win32api などはそんなかんじ >>723
windowsならscanf_s使え、posixならm修飾使えで解決ってことだな windowsの方でもscanf()のmあるのでは? 配列って[]だったら自力でEOS入れなきゃいけないけど[]の中に数字入れると自動で入るの? >>728
逆だ
数字いれると自分で \0 を入れないといけない
数字がない場合は、\0 を自力で書かなくとも良い はい ちょっとお邪魔しますよ
ISR() signal() の違いについて
どちらを使うべきなのか うんちくきぼんぬですよ 組み込み系だとmallocなんか初期化関数ん中でしか使わない。 >>731
AVR libc独自か、規格で定められているかの違い
環境が限定されるならISRで良い 割り込みにまさかの独自ライブラリがあるとは思わなかった
>>736の参照先見ると色々なアトリビュートが設定できるようになっとるわw
その内容をみると自前で割り込み関係のレジスタ叩けば実現可能な機能ばかり
##pop/push/reti自動付加禁止だけはsignal()では実現不能?
signalでよさそうな気が。。。 >>722
他には?
珍獣でないと主張するにはnが小さすぎるぜ
その小さすぎるnでどうたら言っちゃうおまえ
自らへの死刑宣告を読み上げている自覚はあるのか? >>727
てか、C言語のライブラリの問題なのであるともないとも言えるよな。
POSIX準拠でないCコンパイラでも同じ動きをするライブラリをリンク時または実行時にリンクするならそう動くわけだし。
WindowsでもGCCでコンパイルするならそうなるわけだし。Cygwinの中ならなおのことそうだ。 そう言えば fgets() も1行の長さが指定した長さ以上になった場合に入力に残るよな。
で、だいたいは妙に長いバッファ用意して誤魔化す(またはそういう仕様にするw)わけだが、
そういうのが通用しない場合はそれを上回る入力をされた時にエラーにするかまたは入力に
残った不要な文字列を捨てる処理はあった方が良い。そうでないなら GCC の getline() を
使うかまたは自作するかだ。 >>743
昔宿題スレで作ったけれども忘れてしまった,まあ誰しも一回はつくるものじゃないかな >>743
> そう言えば fgets() も1行の長さが指定した長さ以上になった場合に入力に残るよな。
当たり前だろ
より長い入力が想定されるなら普通に改行がでてくるまで続けて読めばいいだけだし
妙に長いバッファとかアホすぎる w はははは、やっとn=6か
で、%sさえ使わなきゃscanfは安全なのか? >>747
>はははは、やっとn=6か
いくらでも増やせますが
>で、%sさえ使わなきゃscanfは安全なのか?
fgets() 推しの俺にきかれても,そんなことはわからない‥(困惑) %sの危険性を長々と説明しているwikipediaを挙げてるんだからギャグのつもりだろ
stackoverflowも%sではなく%*sだし、scanf使ったことないのかな? >>749
わからないだと?
おまえシッタカこいてただけか
まあそうだろうな、%s以外に言及できないようだから >>751
fgets()でとりあえず読み込むのは有力な方針だからね、まあsscanf() を後段で使うことはあるね
scanf() のチマチマした書式は必要時に追いかければいい、今調べる必要はないと思うね
>シッタカ
大局観といってほしいね >>753
終わりつーか始まってない
そもそもscanfを把握してない御仁とでは話にならなくて scanf() の詳細仕様を把握しないと判断できない、というのはどうかな?
scanf() が初期のころから建て増し建て増しでどんどん増えていったあの方向性は、正しくない複雑化のしかただと思うよ
scanf() を書く側にたってみると、おぞましい scanf()
scanf()
scanf()
scanf()
scanf() 超ド級初心者なんだけどおすすめの開発環境とかある? >>759
Visual Studio 2017。デバッグが簡単で分かりやすい。 vs2017コンパイルの仕方がわからなかった(´・ω:;.:... >>761
プロジェクトにソースファイルを追加して、デバッグメニューからビルドを選ぶだけだぜ。 ビルド押したんだけど反応がなかったんだ・・・
もっかい調べなおしてみる
ありがとう >>757
建て増しする前の単純な仕様のscanfでさえ
%sしか攻撃できない空っぽ脳みそと
どうやってコミュしろというのか教えてくれ >>763
プロジェクト作成しないとビルドできない vs2017ならフォルダを開くで
勝手にプロジェクトが作られるんじゃなかったかな 開発環境はvim+gcc、そしてmakeだな。
人に勧めようとは思わないけどね。 まあ入出力でCとC++で違うのは解ってたけど本読んで書いてあったのはC++で書いて動かなかったら
最悪Cで書けば動かせるということは書いてあったな つか、コマンドラインアプリで文字列受け取るのは、実行時引数だけで充分だろ。 ■ このスレッドは過去ログ倉庫に格納されています