C言語なら俺に聞け 142 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>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文の中身を見るに全くの素人じゃあないな 初期化をあんなとこに書いたらコーディング規約で叩かれるしなぁ〜 >>794
forのカッコ内には同じ変数しか書いちゃダメって思ってる初心者はいるかも
個人的には変数名からCOBOLer疑惑の方が強い気がする VS2017でやってるんだがさっき作ったプログラムを保存して別のファイルで勉強を再開しようとして新しくファイルを作ったんだ
そしてテストも兼ねてさっきのプログラムコピペしたら
プリコンパイルヘッダーを検索中に不明なEOFが見つかりました。
'#include"stdafx.h"をソースに追加しましたか?
と出た
さっきは何もなかったのに >>797
それな
よく分からんけど空のプロジェクトってやつでプロジェクト作って自分でソースファイル作成すれば出てこない
まあ詳しい人が教えてくれるかも >>797
プリコンパイルヘッダーというのは、プロジェクト内のヘッダーを事前にまとめてコンパイルしてビルドを早くする仕組みのことだ。
通常、stdafx.hというヘッダーにプロジェクトで使うヘッダーをまとめる。
一つ一つのソースファイルごとのプロパティでプリコンパイルヘッダーを作成するか、使用するかを設定できる。 ソースコード関係の知識は苦Cやらで積めるけどソフトやらの知識はどこで積むんだ プリコンパイルヘッダーを使用するのであれば、プロジェクト内のどこかのソースファイル(例えばstdafx.cpp)を使って、プリコンパイルヘッダーを作成しないといけない。
あるソースファイルにおいてプリコンパイルヘッダーを使用するのであれば、プリコンパイル対象のヘッダーを#includeして、そのソースファイルがプリコンパイルヘッダーを使用することを設定する。
プリコンパイルヘッダーを使用しないなら、すべてのソースのプロパティでプリコンパイルヘッダーを使用しないように設定する(空のプロジェクトの規定値)。 ソースファイルが二、三個なら、とくにプリコンパイルヘッダーは、必要ない。 >>800
おとなしく>>798の言う通りにしろってこと ソースファイルのプロパティは、IDE内のソースファイルのアイコンを右クリックして「プロパティ」を選ぶと設定できる。 >>804
とりあえず空のファイルは作れたけどソースが書けん 新しいプロジェクト
↓
空のプロジェクトを作成
↓
空のソースコードファイルを追加
↓
>>789をコピペ
↓
実行 >>807
空のソースコードファイルどうやって作るんだ >>808
プロジェクト開いたときの右にあるソリューションエクスプローラの中のソースファイルというフォルダを右クリックして「追加」から「新しい項目」をクリック。
「C++ファイル」を選択した状態でファイル名の拡張子を.cに変えて「追加」ボタンを押す。 >>809
できた
もしこれから新しくファイルを作る場合はこれを一からやるのか? >>810
うん。
簡単なプログラムならVSでプロジェクト作るよりもスタートメニューのVSのフォルダの中にある開発者コマンドプロンプト使ってclコマンドでコンパイルした方が手軽だな >>812
ありがとう
これ以上はスレチだからやめておこう スレチかもしれないけどVS2017でANSI C(C99/98, ブロック先頭でしか宣言できないやつ)だけしかかけないようにできますか? みなさんは関数名の後に続く中括弧の前に改行を入れますか?入れませんか?
例えば、
int main(void) {
/* 処理 */
}
のようにするか、
int main(void)
{
/* 処理 */
}
のように書くのか、どちらが多いのか気になります。 if ()
{
}
ならいいけど
for () {
}
だと整合性無いじゃん
って話なら気にするな
だな >>815
改行入れるね。
なんでそうなったかというと、C言語は昔は引数の型をカッコ内に書けなかった。つまり
int main(argc, argv)
int argc;
char *argv[];
{
・
・
・
return 0;
}
のようにしか書けなかった。その当時から覚え始めたというのと、K&R もそれで書いて
あったのでそのまま何も考えず俺の中で改行入れるのが定着した。 for()
{
}
こうしたときに一行増えるから嫌だだっていう人が多そうだな 関数では改行して、制御構文では改行しない
みたいなオレルールにしてる c#みたいにメソッドを直接鉤括弧内にベタ書き出来る言語でもなけりゃ先行改行一択なんだがなあ 今みたいに時間単価での清算が主流になる前は、
ステップ単価清算ってのもあって、K&R以外で書くと
増量しているって言われていたの。
cb とか indent なんてコマンドはその名残かな >>826
無名関数が書けると最初の { 前の改行がおかしい気になるので
自動的に改行入れない派になるという話では? >>815
統計取る方法がないから、確実な答えはわからないと思うよ。
で、戦争のたびに出る結論が「気にするな」「仕事環境に従え」なんだよねー。
で、俺はどうかと言うと、俺も不思議と>>823に落ち着いた。 http://9cguide.appspot.com/15-05.html
これのモードの切り替えってところで判定結果違うんだが俺だけ?
pがでたらめな数字になる
コピペしても変わらなかったから多分タイプミスとかじゃないと思う 下の[実行結果] のように出力されるためには
× printf("p = %d\n",p);
○ printf("*p = %d\n",*p);
でないとな 10 1
scanf("%d%d", a, b);
こう読み込んだ時に空白を飛び越えて読み込んでくれるん?
10,1
この時はエラーになっちゃう? 多分空白はできる
,を入れたかったら%d,%dすれば多分できる scanfのフォーマット指定は面倒だぞ
正直使いこなす気すらない if () {
}
else {
}
このフォーマットだと心が平和 ■ このスレッドは過去ログ倉庫に格納されています