C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>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で書けば動かせるということは書いてあったな つか、コマンドラインアプリで文字列受け取るのは、実行時引数だけで充分だろ。 対話型ツールなら、きちんと入力解析エンジン載せれや。
なんだよscanfってw gccのワーニングで、「declared inside parameter list」これを無視したいです。
-Wではじまるオプションはなにを指定すればよろしいですか?
#pragma GCC diagnostic ignored "-W??? >>775
[enabled by default]と書いてあるだろ? この警告はフラグで消せない。アホなコードを直すしかない。 >>776
フラグ以外での除去方法もないのでしょうか?
大量にでるために困っています >>777
警告は、引数リストの外側で必要なものを宣言すべきという意味だ。 https://ideone.com/91sohX
へぇ 構造体のポインタだし通しそうだけど警告出す仕様なのか
(3行目 実体は不明だけど構造体のポインタを受け取るぞ宣言で警告) 関数の前にstruct aho;とでも書いておけ。 >>778
原因はわかっています。
構造体宣言を別のヘッダーで行っているにもかかわらず、
プロトタイプ宣言しているヘッダーより上に定義がないのが原因です
>>780
gcc -w ?
#pragma GCC diagnostic ignored "-w" でしょうか? 本当の定義じゃなくて 仮定義を前に置くだけで消えるのな
struct foo;
void func(struct foo* arg); >>783
やはりそのように潰していくしかないのでしょうね。 >>782
-Wで始まるオプション名は無いので無視するにはコマンドラインで-wを指定するしかない >>784
いや、てか、そのヘッダ書き換えられないのか? 自身のポインタを構造体に宣言するのと同じ様に書けよ。 とりあえず勉強の成果として作ってみたら失敗した
なんでだ
#include <stdio.h>
int main(void)
{
int hyoji;
int kakikomi;
printf("階乗の表示:");
scanf("%d\n",&kakikomi);
for (hyoji = 1;kakikomi > 0;kakikomi--) {
hyoji = hyoji * kakikomi;
}
printf("結果は%dです", hyoji);
fflush(stdin);
getchar();
return 0;
} >>789
scanfのところの\nって要らなくね こんなすぐに桁溢れしちまう様なサンプル作ったら、何を試したいのかわからんだろ。 しかしてfor文の中身を見るに全くの素人じゃあないな ■ このスレッドは過去ログ倉庫に格納されています