[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 07/29 12:15 / Filesize : 128 KB / Number-of Response : 591
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 36



1 名前:デフォルトの名無しさん mailto:sage [2008/09/15(月) 11:40:35 ]
C言語の入門者向け解説スレです。

教えて欲しいのではなく宿題を丸投げしたいだけなら
↓宿題スレ↓へ行ってください。
  C/C++の宿題を片付けます 115代目
  pc11.2ch.net/test/read.cgi/tech/1217741118/

・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
  # 抜粋/整形厳禁、コンパイラに渡したソースをそのまま貼ること
  # サイズが大きい場合は宿題スレのアップローダ等を利用してください
・開発環境や動作環境も晒すと答えが早いかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
  C言語なら俺に聞け(入門篇) Part 35
  pc11.2ch.net/test/read.cgi/tech/1219761846/
過去スレ
  makimo.to:8000/cgi-bin/search/search.cgi?q=%82b%8C%BE%8C%EA%82%C8%82%E7%89%B4%82%C9%95%B7%82%AF&andor=AND&sf=0&H=&view=table&D=tech&shw=5000

313 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:34:37 ]
#ifdef _DEBUG
#include <stdio.h> //for sprintf
#endif

_DEBUGってなんですか?

314 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 19:39:57 ]
ttp://www.wakhok.ac.jp/~kanayama/C/03/node112.html

315 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 20:47:47 ]
>>313
VCではデバッグモードでコンパイルすると
_DEBUGが暗黙のうちにdefineされる。

316 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:48:54 ]
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
}

whileでstrの未処理の値を読み捨てているらしいけど、そこがしっくりこないんだが。
fgetsで読み捨てるって、具体的にどういう処理だ?><

317 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:53:57 ]
>>316
モードが何かは知らんけど、読み捨てるって一定条件に達したら
その後データが存在してても読まないだけじゃないの?

318 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:54:24 ]
サイズをオーバーしたとき

でもその処理そもそもエンターで入力終了と決め込んでるという点がダメな気もする

319 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 00:55:02 ]
316のはよくない例だな

320 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:01:28 ]
すまん、学校の宿題というかプリントに乗ってるプログラムなんだ><w
実際は
char str[BUFSIZE];
char dummy[4];
int a = 0, b, len;

while(a >= 0) {
printf("a, b = ? ");
fgets(str, BUFSIZE, stdin);
len = strlen(str);
if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
while(str[len - 1] != '\n') {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
}
continue;
}
if(sscanf(str, "%d %d %3s", &a, &b, dummy) != 2) {
printf("input format may be imcomplete\n");
continue;
}
printf("a = %d, b = %d\n", a, b);

}
こんななってる。安全な入力方法の一つだそうで。
オーバー時のwhileの処理は、未処理のまだ残っている値のクリアが目的らしいんだけど、
fgetsでどうクリアするのかがよくわからん><

321 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:04:18 ]
BUFSIZE以上の文字数が入力された場合にBUFSIZE-1で割った最後のあまりのみを有効にする、
かなり頭の悪いやり方。



322 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:11:01 ]
continueがあるから違うだろ。

while(getchar()!='\n')で十分な気はするが。

323 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:17:36 ]
>>322
そうそう、それでもいいって書いてあった。
あれか、未処理だった部分がstrに入ってくるんかね?
んで、未処理だった値も処理されてクリアってこと?><

324 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:21:37 ]
もし想定してるよりも長い文字列が入力されてれば
読み込みきれなかった分までstrに上書きしながら
順次読み込んでいって、以降するはずだった処理は
全部ぶっ飛ばしてまた最初からと言う方法を取ってる

325 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:26:05 ]
ifの直後に同じ判定をwhileでするのは無駄だと思うけどな。
こういうときこそdo{}while使ってやれよw

326 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:28:40 ]
>>324
ありがとうございます、なんとなく解りました。

327 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:32:44 ]
>>325
ちゃんとみろ、それは的外れだ

328 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:35:20 ]
>>327
if内に進んだ最初のwhileの判定はifでしたのとまったく同じだけど?

329 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:42:13 ]
>>328
お前continueが見えてないの?

330 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:43:26 ]
>>329
この話にcontinue関係ないw

331 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:48:29 ]
>if(str[len - 1] != '\n') {
これと
>while(str[len - 1] != '\n') {
これの条件判定が同じで、whileの一回目の判定が無駄だって言ってるんだが理解できてる?



332 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 01:52:17 ]
まあ、こう言うときはこう直せば良いんじゃね?
とソースを書けば一番手っ取り早いよねと横レス

if(str[len - 1] != '\n') {
printf("input line may be imcomplete\n");
do {
fgets(str, BUFSIZE, stdin);
len = strlen(str);
} while(str[len - 1] != '\n');
continue;
}

333 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:30:55 ]
自分の関数を周りに使わせたがる同僚にはどう対処したらいいですか?

334 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 02:33:02 ]
上司になっていいように使う。

335 名前:デフォルトの名無しさん [2008/09/25(木) 04:16:05 ]
すまそ。。度忘れしてしまって、googleってもでてこないので、おしえて。

超簡単なことなんだけど、C言語の配列って宣言時にしか初期化できないんだっけか?
しばらくC言語やってないもんで。。

よろしく。

336 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 07:39:47 ]
別に好きなとこで代入とかして初期化すればいいだろう

それとも初期化子の使用のことか?それなら、宣言時にしか使えないな

337 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:34:04 ]
strcpyとかstrcatとかsprintfとか使いまくってるんですけど
やっぱバグおきますかね?
参考にしてるソースではstrcpy_sとかstrcat_s、sprintf_s使ってるんですが
私BCC使ってるので使えないんです(たぶん)

338 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 08:36:50 ]
>>337
sprintf()でも%sや%fを生で使わなければ随分違うと思うよ。
例えば、%.20sとするとか%10fにするとかいっそ%gを使うとか。

339 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 10:27:10 ]
>>337
_sの方を使ってても同じぐらいバグを出しやすいと思うよ。バグっても
セキュリティホールになりにくいだけで。
C++のstringやらCStringを使うほうがいいです。



340 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 11:48:17 ]
CのスレでC++の話をする奴って何なの?

341 名前:335 mailto:sage [2008/09/25(木) 13:37:47 ]
>>336
そうです。初期化子のことです><; やっぱ宣言時にしかつかえないんですね><;

宣言時以降で、array[] = {1, 2, 3, 4, 5}; とかいう文をCでそういえばみないなあとおもって。

Javaとかの高級言語ばっかつかってたから、脳みそパープリンになってました。本当にありがとうございました><;



342 名前:デフォルトの名無しさん mailto:sage [2008/09/25(木) 13:42:52 ]
Cも一応高級言語なんですけぉ

343 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/25(木) 22:29:03 BE:488578627-2BP(100)]
>>337
バグ起きるかどうかは自分のコーディング次第じゃない?
strcpy_sはBCCじゃ使えないけど、自分で作ればおk

344 名前:デフォルトの名無しさん [2008/09/26(金) 07:51:18 ]
CPU 使用率を下げたいのなら、Sleep(0) ではなく Sleep(10) などと待ち時間が必要

345 名前:デフォルトの名無しさん [2008/09/26(金) 08:08:07 ]
おれ=くさかべ先生

346 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 08:11:17 ]
BUGなのに、偶然としてそれが表にでてこない。
そんなのがバグ。

人は間違えるもの、間違えた時の危機管理が問題であって、
完璧に間違えないように作るという方向では、危機を避けることができない

君がやっているのは問題の先送り。トラブルがでてから対処すればいいじゃん。
それが致命傷になる。


347 名前:デフォルトの名無しさん [2008/09/26(金) 12:39:51 ]
保険に入ってれば事故ってから対処すればいいじゃん、てのと同じだな
事故んねえように日頃から心がけることこそ管理しきれない危機への危機管理

どんなにセキュアなシステムでも使う奴がアフォでは結局危ない、という意味で
> 自分のコーディング次第
に賛成

348 名前:デフォルトの名無しさん mailto:sage [2008/09/26(金) 13:17:35 ]
サイバーノーガード戦法?

349 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:38:21 ]
大学の授業をサボりぎみで、いつの間にかついていけなくなっていた俺に良い参考書はないですか?
基本まではちゃんとやっていたが、本格的に関数使い出したり二分木のあたりから\(^o^)/

350 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 13:38:57 ]
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    処理3;
  }
} else {
  処理3;
}
処理4;


処理3を1箇所にする書き方を教えてください。

351 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:01:43 ]
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
  } else {
    goto label;
  }
} else {
label:
  処理3;
}
処理4;



352 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:02:33 ]
if (条件1 && (処理1, 条件2)) {
処理2;
} else {
処理3;
}
処理4;

353 名前:デフォルトの名無しさん [2008/09/27(土) 14:04:29 ]
>>351
それはアウトだろボケ

354 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:10:57 ]
switch (条件1) {
default:
処理1;
if (条件2) {
処理2;
break;
}
case 0:
処理3;
}
処理4;

355 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:12:03 ]
>>351
goto使うならこうだな。
if ( 条件1 ) {
  処理1;
  if ( 条件2 ) {
    処理2;
    goto label;
  }
}
処理3;
label:
処理4;


356 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:18:15 ]
>>355
goto入れる場所違わね?

357 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:24:28 ]
正しいと思う場所に入れてみたら?

358 名前:350 mailto:sage [2008/09/27(土) 14:38:05 ]
勉強になりました。ありがとうございます。

359 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 14:44:27 ]
>>349
そのていどwebで十分


360 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 15:46:20 ]
>>355-357
goto入れる場所変えたらどうにかなるもんでもないでそ。
>>355のgoto文以外の並びじゃどうあがいても無理。

361 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 17:27:47 ]
皮肉もわからないのかお前は



362 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 20:19:29 ]
か・・皮肉?

363 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 21:35:05 ]
kuma-

364 名前:デフォルトの名無しさん [2008/09/27(土) 21:44:46 ]
goto を教条主義的に忌避している者は、いざ使おうとすると付け焼き刃で桁下がりが出まくり

365 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:12:52 ]
switch( !条件1 ){
 case 0:
  処理1;
  if( 条件2 ){
   処理2;
   break;
  }
 case 1:
  処理3;
}

366 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:17:12 ]
しつこい

367 名前:デフォルトの名無しさん [2008/09/27(土) 22:57:13 ]
Cに限らないかもしれないけど
0 < hoge
みたいに比較演算子使うときに定数を左辺に持ってくる書き方は
どのようなメリットがあるのですか?

368 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:09 ]
見た目が分かりやすくなるという人も居る

369 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 22:59:50 ]
>>367
イメージとして数直線があるとき

370 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:01:03 ]
0 < hoge && hoge < 10
なんかだと数学の書き方にちょっと似る

371 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:08:13 ]
もう何年も>演算子を使っていない



372 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:09:49 ]
>>370
0 ≦ hoge ≦ 10 みたいな書き方からの連想だよね。

373 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:10:10 ]
>>371
よう俺

374 名前:デフォルトの名無しさん mailto:sage [2008/09/27(土) 23:12:44 ]
>>368
自分は代入演算子と間違えないためかと思ってました

>>369
なるほど〜
数直線なんて単語すっかり忘れてました

>>370
そういう使い方もあるのですね

とても参考になりました
ありがとうございます

375 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:25:39 ]
int配列で hoge[] = {1,2,3,4} みたいな物を
1234と連結させたint型に直したい時に
なにか賢い方法ありますか?

376 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:27:34 ]
>>375
1234と連結させたint型とはなんですか?
10進数の1234ですか。

377 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:28:14 ]
ごめんなさい、そうです

378 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 02:34:06 ]
for(i=0,n=0;i<hogelen;i++) n=10*n+hoge[i];

379 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:17:06 ]
標準ライブラリの関数ってどのぐらい早いの?

380 名前:デフォルトの名無しさん [2008/09/28(日) 08:47:23 ]
Windowsで、system("test.exe")と実行ファイルを呼び出したとき、
test.exeはどのパスにあるか調べる方法はありますか?

381 名前:デフォルトの名無しさん [2008/09/28(日) 08:50:53 ]
もしくは、test.exeが利用可能か調べる方法でも良いです。



382 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 08:58:32 ]
>>380
つmain

383 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:01:41 ]
>>379
例えばmemcpyはバイト数指定なのに32bit単位でコピーして端数処理もやってるのもあるから、そこそこ速い

384 名前:デフォルトの名無しさん [2008/09/28(日) 09:02:59 ]
>>382
もうちょい教えてください。やり方判りません

385 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:40:52 ]
>>382じゃないけどargc、argvを貰えと言ってるんだと思う

386 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 09:43:21 ]
二次元配列を別の関数へ渡す時
なぜこの方法で渡せるのかわかりません。
[2][2]で受け渡したいです。

void func(int array[][2]); //関数宣言

void mainf(){

int array[2][2]={1,2,
3,4};

func(array)

}

void func(int array[][2]){
}

387 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:01:23 ]
[2][2]でも渡せる。
なぜ[][2]で渡せるかは配列の構造を調べてみるべし

388 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:05:12 ]
>>387
配列は
最初のアドレスとデータ型さえわかれば

次の番地がわかるってことですか?
そんでNULLまでが範囲ってことですか?

2次元だと添字情報がないと
次の番地がわからないので
書かなきゃいけないってことですね?

日本語でちゃんと説明できませんが
なんとなくわかりました。

389 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 10:11:02 ]
>>388
ただし、範囲のチェックはやってない。

390 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 11:49:54 BE:418780962-2BP(100)]
>>380
環境変数のPATHのディレクトリを順に参照していってtest.exeを探していくんじゃダメ?
なかったら最後にカレントディレクトリ調べて、それでもなければ利用不可能って事になる。

391 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 11:57:31 ]
>>390
カレントディレクトリは一番最初でしょう。



392 名前:マジレスチュウ ◆MaJi/01g.w mailto:sage [2008/09/28(日) 12:34:20 BE:1710022177-2BP(100)]
内部コマンド → カレントディレクトリ → PATHに記述されたディレクトリ
の順番か。ごめんなさい><

393 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 12:42:25 ]
違うだろ

394 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:19:25 ]
環境による

395 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:21:16 ]
windowsの話してるんだろ

396 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 13:44:40 ]
というかC関係ないね

397 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 15:12:09 ]
だよな

398 名前:くさかべ様 [2008/09/28(日) 16:44:19 ]
まあ俺に聞けばなんでもわかる、mixiでもIRCでも俺が相手になってやる。



399 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 16:48:57 ]
豆でも食ってろ

400 名前:デフォルトの名無しさん [2008/09/28(日) 18:18:09 ]
すみません。友達にEclipseっていうののコンパイラだと何も設定しなくても
使えるときいたのですが、本当ですか?

以前、ボーランドという会社のコンパイラを使おうと思ったのですが
うまくいかなかったので。。

もし、なにも設定しなくてもいいなら、つかってみたいんですが。
よろしくお願いします。

401 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:21:46 ]
Eclipseはコンパイラじゃないよ



402 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:23:06 ]
>>400
なにも設定したくないならvisualstudioおすすめ

403 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:26:45 ]
PCの基礎知識が無いのにプログラミングは早すぎる

404 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 18:38:19 ]
パスも通せないでプログラムですか

405 名前:400 mailto:sage [2008/09/28(日) 18:40:10 ]
みなさん、ありがとうございます。やはり、私には無理みたいですね。
一度プログラムというのをやってみたいと思っていたのです。
visualstudioでググってみましたら、ただらしいですね。そいつでやってみます。
このいたの上にも情報があるみたいですね。ありがとうございました。

406 名前:デフォルトの名無しさん [2008/09/28(日) 19:24:39 ]
>>405
がんがれノシ

407 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 19:31:03 ]
>>405
まあ、これで覚えろ

きっかけが無いと覚えれないしな。

408 名前:デフォルトの名無しさん [2008/09/28(日) 22:19:16 ]
main関数の2番目の引数の char *argv[]
って、argv[]っていう配列へのぽちんたという意味なのか、
ぽちんた変数配列argvっていう意味なのかどっちなの?

教えてエロイ人。

409 名前:408 [2008/09/28(日) 22:20:06 ]
まちがえた。

ぽちんた変数配列argvっていう意味
     ↓
ぽちんた変数の配列argvっていう意味

410 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:25:00 ]
char *argv[]っていう書式的にはぽちんた変数の配列argv
っていう意味で合ってる

でも実際はchar **argvだけど

411 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:26:37 ]
ぽちんた変数と呼ぶのが今の流行りなのか?



412 名前:デフォルトの名無しさん mailto:sage [2008/09/28(日) 22:34:33 ]
幼稚な奴にあわせる必要は無い

413 名前:408 mailto:sage [2008/09/28(日) 22:56:14 ]
みんなどうもありがとう。ぽちんた変数の配列argvっていう意味なんだね。

細かいところがむずかしいね。ありがとう。よくわかったよ。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<128KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef