C言語なら俺に聞け(入門篇) Part 18
at TECH
1:デフォルトの名無しさん
07/08/16 06:39:50
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 17
スレリンク(tech板)
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 94代目
スレリンク(tech板)
2:デフォルトの名無しさん
07/08/16 06:40:23
Part 1 スレリンク(tech板)
Part 2 スレリンク(tech板)
Part 3 スレリンク(tech板)
Part 4 スレリンク(tech板)
Part 5 スレリンク(tech板)
Part 6 スレリンク(tech板)
Part 7 スレリンク(tech板)
Part 8 スレリンク(tech板)
Part 9 スレリンク(tech板)
Part 10 スレリンク(tech板)
Part 11 スレリンク(tech板)
Part 12 スレリンク(tech板)
Part 13 スレリンク(tech板)
Part 14 スレリンク(tech板)
Part 15 スレリンク(tech板)
Part 16 スレリンク(tech板)
3:デフォルトの名無しさん
07/08/16 06:41:08
3ゲト 1乙です
4:デフォルトの名無しさん
07/08/16 06:42:58
〇∧〃 初心者からの質問?
/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
Wikipedia項目リンク
> 元々「オッパッピー」は卑猥な言葉の略語だったらしいが、他の芸人にダメ出しを受けて
> 「オーシャンパシフィックピース」に変更した。
5:997
07/08/16 06:43:47
すみません、名前変えるのわすれてました、前スレの997です
前スレの>>998さん返答ありがとうございます。その書き込み不可属性というのは
どうやったら解除できるんでしょうか?
6:デフォルトの名無しさん
07/08/16 06:46:19
>>5
ファイルを右クリックしてプロパティを開く
Windowsなら読み取り専用ってチェックボックスのがある
7:デフォルトの名無しさん
07/08/16 07:13:18
Cでリストとかキューとかの汎用ライブラリをガツガツ使いたかったら
C++使えってことですよね?
自分で書いても良いですけど効率悪いので...
皆さんはどうされてます?自分で全部かいてます?
8:デフォルトの名無しさん
07/08/16 07:14:28
C++使う
9:デフォルトの名無しさん
07/08/16 08:17:50
テンプレートがないと辛いね。
マクロでも実装はできるけど、エレガントとは言いがたい。
10:デフォルトの名無しさん
07/08/16 08:37:31
>>9
Linuxでデバイスドライバかいてると
マクロで実装した汎用リストがあったりするんですが
それ使えるのはもちろんLinuxカーネルだけだから
それの汎用バージョンみたいなのないのかなぁ...っと
11:デフォルトの名無しさん
07/08/16 08:45:30
そこだけ綺麗に描き直してフォークすればいいじゃん
12:デフォルトの名無しさん
07/08/16 08:47:22
>>10
こんなの見つけた
URLリンク(www5d.biglobe.ne.jp)
13:5
07/08/16 17:30:09
>>6 返答ありがとうございます。
また質問なのですが、Visual C++:2005 の設定を間違えて保存などした場合、
どうすれば初期設定にもどせるんでしょうか?
14:デフォルトの名無しさん
07/08/16 17:32:21
C言語のスレで前スレ最後の書き込みがオッパッピー解説ってどうよ
15:デフォルトの名無しさん
07/08/16 17:56:05
だが、それがいい
16:デフォルトの名無しさん
07/08/16 18:00:46
正直に言えやぁ、ほまは オッパッピー がむっちゃ好きなんやろ?
男なら絶対そうやろ?隠さんでええよ、バレとるからw
17:デフォルトの名無しさん
07/08/16 19:17:35
ツール → 設定のインポートとエクスポート → すべての設定をリセット
18:デフォルトの名無しさん
07/08/16 22:19:28
整数Aは整数Bの何%であるか表示するプログラムのソースを教えてください。
19:5
07/08/16 22:23:27
>>17 レスありがとう でも戻らないorz
なんかマイクロソフト公式HPに
Visual SourceSafe エクスプローラのプロジェクト ペインで削除されたファイルが所属していたプロジェクトを選択します。
[ファイル] メニューで [プロパティ] をクリックし、[削除された項目] タブをクリックします。
復元するファイルを選択します。
[復元] をクリックします。
って書いてあるけど、これどうやるんでしょうか?
20:デフォルトの名無しさん
07/08/16 22:52:50
>>19
再インスコ
21:デフォルトの名無しさん
07/08/16 23:02:08
>>19
それは Visual SourceSafe がインストールされてないとどうにもならない
Visual SourceSafe エクスプローラは Visual SourceSafe の本体の一部だしな
っつーか
その「書いてあるけど、」の部分は SourceSafe の中に格納したデータを削除した時に
SourceSafe の中の「ごみ箱」的な場所からデータを復元させるための手順なんだが
この際再インスコに同意しておく
22:デフォルトの名無しさん
07/08/17 10:59:14
ポインタと配列で質問なのですが、
int a[3][4];
int *p = a[0];
のように、int * 型のポインタ p を a[0] に初期化すれば、 a[i][j] は p[i*4+j]
と書いても同じことになります。ネットのポインタ説明よりコピペなのですが、
a[i][j] は p[i*4+j]この部分が良く分かりません。[i*4+j]の詳しい解説を
していただけませんか?
23:デフォルトの名無しさん
07/08/17 11:04:55
初期化の部分はint *p = a;の間違いだと思うが、
a[3][4]は、メモリ上(?)で
a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]、a[1][1]、a[1][2]、・・・・
という順番になっているから。
24:デフォルトの名無しさん
07/08/17 11:11:51
int *p = a; のaはaの配列の先頭を指しているらしいですよ
25:デフォルトの名無しさん
07/08/17 11:16:54
>>23 じゃあどんな高次元配列(?)でも[i][j]をポインタで表すのに[i*4+j]
と共通してるんですか?なんか悩んでる内に[i*4+j]を覚えてしまった。
分からないのならまるおぼえしてしまおうかなw
26:デフォルトの名無しさん
07/08/17 11:27:40
まさか。その4はどこから出てきたと思ってるんだ
27:デフォルトの名無しさん
07/08/17 11:51:08
こんにちは。次の職場で使うため、C言語の勉強をしているものです。
入門書を一通り読み、簡単なアプリも幾つか作りましたが、
今ひとつ他人のソースを追うのが苦手です。
そこで、数読んで慣れようと考えました。
もしご存知でしたら、ソースを沢山読めるサイトを教えていただきたく。
28:デフォルトの名無しさん
07/08/17 11:55:24
URLリンク(www.google.com)
29:22
07/08/17 12:08:01
配列[i][j] とすると ポインタ[i * jの要素数 + j]ですよね。
考えてもさっぱりなんで公式として覚えてしまおうと思います。
30:27
07/08/17 12:17:12
>>28
ライブラリやフリーのソースについては、
コードリーディングという本で読んでみたのですが、
規模が大きすぎる&仕様がソースのみで、今ひとつでした。
31:22
07/08/17 12:23:57
[i * 型の使用バイト数 * j]かもしれませんね。
32:デフォルトの名無しさん
07/08/17 12:30:03
>>31
冗談だろwww
a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[1][0]、a[1][1]、a[1][2]、・・・・
==a[0] 、==a[1] 、==a[2] 、==a[3] 、==a[4] 、==a[5] 、==a[6] 、・・・・
あとは分かるよな?
33:22
07/08/17 12:58:27
なるほど、そういうことっすか。ポインタに配列を代入した場合、
2次元配列をポインタでを表す場合、感覚で言うと繰り上げないでそのまま数を加算
するんですね。
34:デフォルトの名無しさん
07/08/17 13:08:14
>>23
int *p = a じゃ警告出るだろ。
a[0] か *a か (int*)a じゃないと。
35:22
07/08/17 13:10:17
日本語変だorzエスパー読みしてください
36:デフォルトの名無しさん
07/08/17 13:13:52
>>34
そうだな。スマン
37:19
07/08/17 14:03:38
サイスコして復活したのはいいけど、こんどはソースいじって上書きしようとしても
アクセス権限がありません、管理者に許可をもらってください。ってでる
どうしたらいい?
38:デフォルトの名無しさん
07/08/17 14:07:09
あー
ものすごくアレだ
もしかしてVista使ってて
VisualStudioにまだ公式Vista用パッチ当ててないか
ソースを\Program Files\の下に保存かけてしまってる
とか
なんか
39:19
07/08/17 14:32:53
>>38 それかぁああああ!!!
どうしたらいいかおしえて1おねがい!おしててうhw
40:デフォルトの名無しさん
07/08/17 14:55:58
C言語と関係ないし、内容も別スレで聞いたほうが早いと思うから
それ以上はVisualStudio関連スレでやって下さいな。
41:デフォルトの名無しさん
07/08/17 14:59:10
>>39
ラスト。これ以上は判らんスよ
MSのサイトで 2005 update SP1 vista で検索しとけば大概わかるっしょ
あとは別スレで
42:デフォルトの名無しさん
07/08/17 17:41:01
この質問してたヤシが30過ぎたおっさんだったら失笑してしまう。
43:デフォルトの名無しさん
07/08/17 23:10:09
>>42
30過ぎの女性だとしても苦笑もんだな。
44:デフォルトの名無しさん
07/08/17 23:51:08
>>22
配列は、大きな連続した領域として、メモリ上に確保されます。
a[3][4]とb[12]はメモリ上では同じ様に存在します。
仮に a == b(同じアドレス)だとしたら。
&a[0][0] == &b[0]
&a[0][1] == &b[1]
&a[0][2] == &b[2]
&a[1][0] == &b[4]
&a[2][0] == &b[8]
&a[2][3] == &b[11]
の様に対応します。
aの右側の添字が1増える毎に、bの添字が1増え、
aの左側の添字が1増える毎に、bの添字が4増えるのが分かるとおもいます。
お察しの通り、4は要素数です。
したがって a[i][j] は b[i*4+j] です。
2次元配列は1元配列を、ただ折り畳んだものと考えれば分かりやすいでしょうか?(下の例で同じ文字同士が対応していると思ってください)
1次元配列:a[12]
0123456789AB
2次元配列:a[3][4]
0123
4567
89AB
45:デフォルトの名無しさん
07/08/17 23:53:28
図に描いてみればすぐわかるんだけど、文章で説明するのは難しいね。
46:デフォルトの名無しさん
07/08/18 00:01:34
こんな俺におすすめのCの教科書を教えてくれまいか。
・Javaはそれなりにやってる。
・Cは「触ったことある」レベル。ポインタのポインタって頭破壊する気? マクロとか#defineぐらいしか知りませんが?
・内容は多少ハイレベルでも大丈夫、というかみっちりやってくれる本の方が嬉しい。
・演習がしっかりある奴がいい。むしろ多少重いぐらいで丁度良い。
お願いしますだ
47:デフォルトの名無しさん
07/08/18 00:52:41
>>46
規格書。
・プログラミング初心者向けではない。
・それを知るために読むのだろ。
・内容はハイレベルだが漏れもなければ間違いもない。
・世の中の全てが演習のテーマだ。
48:デフォルトの名無しさん
07/08/18 01:07:08
>>47 それ以外で何か頼むw 規格書もいつか読むんだろうけどさ・・・
49:デフォルトの名無しさん
07/08/18 01:55:23
>>46
C++だけど「独習C++」なら持ってる。演習付き。
これのC版はどうだろう?(俺は読んだことないけど)
書店で片っ端から開いてみたら?
ところで、ポインタのポインタで頭破壊なら、二次元配列でも頭破壊か?
50:デフォルトの名無しさん
07/08/18 03:29:35
>>49
独習Cは書店にあったなー。平積みだったし、定評ある本なんだろうなやっぱり。thx
2次元配列は大丈夫、かな? ポインタで要素にアクセスしようとするのは慣れないけど。
基本的に、ポインタ周りの使い方と理解が全くだめ。Javaにポインタがないからだねw
参照という意味ではJavaでも無意識で使ってるのは確かだけど、Cだときっちり意識して使わないと駄目な感じに見える・・・
51:デフォルトの名無しさん
07/08/18 04:15:36
今 C言語勉強中で一通り超基礎を終わらせたのですが教えてください><
int ia;
while(ia != -999){
scanf("%d",&ia);
}
これを実行させて入力時に「a」とかを入れると無限ループするのですが
なぜでしょうか?
もちろんchar型ではないのでこんなんしたらダメだと思うんですが
a のアドレスが ia に代入されるんだったら-999じゃないから
無限ループにならずにまた入力になると思ったんですが・・
なんでだろぅ・・
52:デフォルトの名無しさん
07/08/18 04:24:30
URLリンク(www9.plala.or.jp)
> scanf()で読み込み不一致が起こる問題では、上記 「atoi()、atol()、atof()」を使って回避します。
> 読み込み不一致は、scanf()を for や while などのループの中で用いた場合、入力バッファに
> 残されたデータを永遠に受け付けないため無限ループになってしまい意外に深刻な問題となります。
> そのためデータを一旦、scanf("%s", ○)や gets()を用いて文字列として入力し、それから上記の
> 変換関数を用いて期待するデータ型に変換するのです。
int i = 0;
char a[20];
while(i != -1) {
printf("整数値を入力してください(終了条件:-1)\n");
scanf("%s", a);
i = atoi(a);
}
53:デフォルトの名無しさん
07/08/18 04:30:09
>>52
超すばやいお返事&回答ありがとうございます(@w@
なるほど・・これをすると入力を永久に受け付けなるのですね
しかもサイトまで教えていただいてありがとうございます!
このサイトいいですねw勉強してきます
54:デフォルトの名無しさん
07/08/18 06:22:06
乱数に関しての質問なのですが、教科書には
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void)
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < 10; i++){
printf("%d\n", rand() % 100);
}
return 0;
}
でおkと書いてるんです。
コンパイルは通ったのですがこの部分の
printf("%d\n", rand() % 100);
これってもし 0 がきたら0割りで無限ループになるんでしょうか?
0がくることはないですか?
自分は
printf("%d\n", (rand() +1 % 100);
のほうがいいんじゃないかと思ったのですがどうなのでしょうか?
55:デフォルトの名無しさん
07/08/18 06:22:34
>>52
だからそのサイトは地雷だって。果てしなく間違いが見つかる。
56:デフォルトの名無しさん
07/08/18 06:25:29
>>54
馬鹿もん、0割る100は0だ。
57:51
07/08/18 06:28:18
すいません^^; >>54 は 51です。名前入れ忘れました。
58:デフォルトの名無しさん
07/08/18 06:29:06
>>57
別に誰でもいいから自分宛のレスを読んでレスしてから言い訳しろ。
59:51
07/08/18 06:33:35
あぅ・・すいません。言い訳じゃなかったのですが つw;)
今 0/100やっても大丈夫でした^^;申し訳ありません。
学校でCOBOLとC、同時にやってるのでごっちゃになってしまいました。。
(COBOLは0を割ると無限ループになっちゃうので・・)
一回試してから聞くようにします^^;ごめんなさい
60:デフォルトの名無しさん
07/08/18 06:41:01
>COBOLは0を割ると無限ループ
そうだっけ? どうでもいいけど常識的には有り得ないんだけど。
61:51
07/08/18 06:42:56
>>60
あぅ、うちの学校のホストだけなのか´ω`;
GS−8200って富士通のホストです
62:デフォルトの名無しさん
07/08/18 06:46:09
うぁはは、COBOLってすげー。
--
COBOL アプリケーションプログラムを強制終了するには、2 通りの方法がありま
す。
方法 1
0 で 0 を割る COBOL アプリケーションプログラムを作成します。
63:デフォルトの名無しさん
07/08/18 06:46:36
例外ベクタの飛んだ先にHLTが埋め込まれてるんじゃないの。
古代の処理系ならありがちだよ。
64:デフォルトの名無しさん
07/08/18 06:50:28
ゼロで除算する事が問題になるのはよく聞くけど
ゼロを除算する事が問題になるなんて聞いたこと無いな
65:51
07/08/18 06:54:47
あ!ほんとだ
100/0にしたらコンパイルエラーになった。
完全に私の覚え間違いでした・・ちょっとROMって勉強しなおします・・
66:デフォルトの名無しさん
07/08/18 10:31:49
C言語を勉強する前に身につけておかなければならないことは?
67:デフォルトの名無しさん
07/08/18 10:35:22
>>66
そういう頭でっかちの考え方を捨てること
68:デフォルトの名無しさん
07/08/18 10:37:58
基本スペックは中卒+パソコンオタクです
69:デフォルトの名無しさん
07/08/18 10:46:27
なんだかんだ言っても、コンピュータの仕組みを知ることも重要だよね。
人によってはコード、文字列を入力しているようにしか思えないだろうけど
汎用電子計算機に処理してもらっていること、どのように処理されているのかとか。
そういうのを知ると、より適切なプログラミングが出来るようになる。
70:デフォルトの名無しさん
07/08/18 11:12:26
>>55
なんか、そのサイトの作者が自作自演で宣伝してるんじゃないかってかんぐりたくなるな。
71:デフォルトの名無しさん
07/08/18 11:19:22
だとしたらかなり高度な自演だなw
72:デフォルトの名無しさん
07/08/18 20:06:55
〇∧〃 初心者からの質問?
/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
全部わすれておっぱっぴー!
73:デフォルトの名無しさん
07/08/18 20:29:38
一つ質問があります。よろしくお願いします。
realloc()についてなんですが、このメモリ領域拡大縮小関数の
P186の定義を見てあきれたんですが、
新規にメモリを確保して、memcpy()で内容をコピーしてるんですが
領域を縮小するときはともかく、領域を拡大した場合、
元のメモリ領域の外までコピーしていますよね。
これってエラーにならないんですか?
確かに書き換えているわけではないので
問題ないのかもしれませんが、これじゃメモリを別アプリから覗き見放題じゃ
ないですか。本当のところどうなんでしょうか。単にわたしの資料が古いだけかな。
それと今、C++でrenew()みたいな関数作ろうと思ったんですが、
元のメモリ領域のサイズがわからないので難儀しています。
何かよい解決策がありましたらご教授ください。
74:デフォルトの名無しさん
07/08/18 20:31:22
P186って、なんのページ?
75:デフォルトの名無しさん
07/08/18 20:37:50
こっちが呆れた。
76:デフォルトの名無しさん
07/08/18 20:40:54
標準ライブラリって仕様は統一されてても実装は処理系依存じゃ?
77:デフォルトの名無しさん
07/08/18 20:58:29
>>76
標準の話じゃなくて、なにかの本のP186に載ってる実装例の話でしょ。
78:デフォルトの名無しさん
07/08/18 21:03:54
P-186号文書
79:デフォルトの名無しさん
07/08/18 21:04:23
文字列がABCDEFG・・・みたいに続いていて
2文字目だけコピーするまたは3文字目から5文字目をコピーするといった方法ありますか?
strcpy()だとできない・・・
80:デフォルトの名無しさん
07/08/18 21:07:36
memmove, memcpy, strncpyとか
81:デフォルトの名無しさん
07/08/18 21:11:28
>>74
ANCI C言語辞典です。
ちなみに、XPでBCCのC++でnew使って同様にmemcpyしてみましたがエラーにならないようですね。
char* p1;
char* p2;
p1 = new char[10];
memset(p1, 'A', sizeof(char)*10);
p2 = new char[1000000];
memcpy(p2, p1, sizeof(char)*1000000);
delete p1;
delete p2;
82:デフォルトの名無しさん
07/08/18 21:14:25
>>81
そりゃエラーにならんだろう
範囲外を書き換えているわけじゃないし
83:デフォルトの名無しさん
07/08/18 21:26:36
>>74
オッパッピーのピーだよ、きっと
84:デフォルトの名無しさん
07/08/18 21:27:46
>>79
こんなんでどうでしょう
const int siz = 3;
char s[] = "ABCDEFG";
char* p;
p = new char[siz];
memset(p, '\0', siz);
p[0] = s[1];
printf("2文字目:[%s]\n", p);
memset(p, '\0', siz);
memcpy(p, &s[2], sizeof(char)*3);
printf("3文字目から5文字目:[%s]\n", p);
memcpy(p, &s[2], &s[5] - &s[2]);
printf("3文字目から5文字目:[%s]\n", p);
delete p;
85:デフォルトの名無しさん
07/08/18 21:29:43
>>82
やっぱりそうですか。了解しました
86:79
07/08/18 22:00:39
>>84
サンクス!なんとかできた
87:デフォルトの名無しさん
07/08/18 23:18:53
>>86
間違っても>84を真似してはいけません。それはCではありません。
--
bool strExtract(char * dest, const char * str, unsigned from, unsigned to)
{
if (str == NULL || dest == NULL) return false;
unsigned length = strlen(str);
if (from - 1 >= length || from < to) return false;
length = to - from + 1;
sprintf(dest, "%*.*s", length, length, str + from - 1);
return true;
}
char buf[100];
char str[] = "ABCDEFG";
// 2文字目をコピーした文字列を得る
strExtract(buf, str, 2, 2);
// 3-5文字目をコピーした文字列を得る
strExtract(buf, str, 3, 5);
88:デフォルトの名無しさん
07/08/18 23:30:44
84、87は初心者か、悪意のある上級者だろうな。
89:デフォルトの名無しさん
07/08/18 23:36:04
>>88
84が初心者(というか、自称初級者)で87が悪意のある(というか、臍曲がりの)上級者かと。
90:デフォルトの名無しさん
07/08/18 23:36:13
#include <stdio.h>
#include <string.h>
int main(){
char a[]="ABCDEFG";
char b[10];
/* 3文字目から5文字目こぴー */
strncpy(b, a+2 ,3);
b[3]='\0';
/*確認*/
printf("%s.%s\n", a, b);
return 0;
}
91:デフォルトの名無しさん
07/08/18 23:43:04
>>73
realloc()の返り値は、渡した引数と必ずしも一致していない。
必要なら、別の領域を探してきてそちらに移す。
というか、
>>これじゃメモリを別アプリから覗き見放題じゃないですか。
物理アドレスと論理アドレスの違いを勉強してくれ。
92:デフォルトの名無しさん
07/08/18 23:49:34
>>79
90が普通の書き方だけど、Windows環境なら、windows.hをインクルードして、
lstrcpyn()を使う方法も。
93:87
07/08/18 23:57:12
一部訂正。
--
- if (from - 1 >= length || from < to) return false;
+ if (to - 1 >= length || from < to) return false;
--
toで制限しておけばfromは必然的に制限の必要がないのを逆にしてしまった。
toで制限するなら、%*.*sも冗長と言えば冗長か。%.*sにすれば引数のlengthが一つですむ。
>>88>>89
何さ。
>>90>>92
strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が潰しが利きそうな気がするが。
94:90
07/08/19 00:07:12
>>93
>strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が
両方覚えるのが良いかと思います。後回しにするのならまだしも、
少なくともこの時点で切り捨てる必要は無いでしょう。
両方知れば、使い分ける事ができますから...
95:デフォルトの名無しさん
07/08/19 00:07:46
>>93
覚えるのは「strcpy()の長さ制限のあるバージョンがあったな」ってくらいでいいでしょ。
使うときは、仕様を確認すればいい。
96:デフォルトの名無しさん
07/08/19 00:15:29
strncpyはstrcpyに比べて異常終了しにくいので、まあともかく早く
動かしたいときには、よさそうな気もするけど、データの異常に気づかない
可能性があるのでおすすめではないです。
sprintは普通に重い処理だからスピードとか気にするところでは
避けたいですが、まぁ使いやすいっちゃ使いやすいですね。
memsetで初期化するのも褒められたやり方じゃないよな。
97:デフォルトの名無しさん
07/08/19 00:20:53
>>96
strncpy()でデータ異常に気づかないって、どういうケースで?
98:デフォルトの名無しさん
07/08/19 00:22:24
sprintfは「書式を指定する」てところに、特徴があるので、
その様な状況ではsprintfが適切でしょ。
対して,strcpy,strncpyは文字列のコピーが目的の関数ってことで、
>>79の様なケースでは、関数本来の目的にあってるかと思う。
99:デフォルトの名無しさん
07/08/19 00:26:17
strncpy()は、コピー先の後ろを0で埋めるという仕様があるので、
strncat()を使ったほうが速度的には有利だけど、書き方が直感的ではなくなる。
dst[0] = '\0';
strncat(dst, src, n);
100:デフォルトの名無しさん
07/08/19 00:26:50
>>97
文字列終端の'\0'を忘れるケースがありますね。
101:デフォルトの名無しさん
07/08/19 00:29:28
>>100
コピー元の文字列が、0がついてないような場合でも、長さ制限があるから無事に処理ができてしまうということ?
それは(この文脈では)sprintf()でも同じことでは?
102:100
07/08/19 00:49:40
>>101
送り側の文字列に0が無ければそうですが、送り側に0があった場合でも、
strncpyの場合、送り側が受け側の長さ(与えた長さ制限)以上の場合、付きません。
対して、sprintfならば0は自動的につきます。受け側に起きる問題ですね。
ちなみに >>100 != >>96 ですので、
>>96さんのいう異常が同じ事を言ってるのかは、わかりませんが。
103:デフォルトの名無しさん
07/08/19 00:50:34
指定した長さでコピーがカットされた時、
\0終端してくれないってことだろ
104:デフォルトの名無しさん
07/08/19 01:14:06
char s[] = "12345678", d[4];
strncpy(d, s, sizeof(d));
ってやったときにdは0終端されないっす。
こういう挙動なのでとっても使いづらいっす。
使いどころはないこともないんだけど、
まず使うことはないですね。
105:デフォルトの名無しさん
07/08/19 01:34:21
フリーの統合開発環境でいいのありますか
106:デフォルトの名無しさん
07/08/19 01:35:46
Visual Studio
107:デフォルトの名無しさん
07/08/19 01:39:40
>>104
strncpyの返り値が d じゃなくて、コピー後の末尾だったら良かった。
と思ったことがある。そうすれば、次々に連結する処理が楽かなーと。
まあ、それくらいなら自作出来るけど。
108:デフォルトの名無しさん
07/08/19 02:01:33
>>105
いいのかどうか分からないけど
少し重いが
同じツールでJavaも開発できるエクリプスなんかどうでしょう?
コマンドプロンプトしかありませんが
109:デフォルトの名無しさん
07/08/19 04:40:42
学生なら迷わずVS 2005 academic
110:デフォルトの名無しさん
07/08/19 14:05:01
学生で今はちょっとCをやった所だけど、やっぱりCよりC++の方がすごいソフトができるの?
なでしことかドリトルでは限界があるの?プログラマーは生涯にたくさんの言語を使うらしいけど
DとかJavaとかいろいろありすぎてどれをやればいいのか分からない、とりあえずCからやってるけど
111:デフォルトの名無しさん
07/08/19 14:08:05
初めはJavaかC#からやるのがいいんじゃないかな
Cはその次がいいと思うよ
112:デフォルトの名無しさん
07/08/19 14:20:16
マジで? ちょっとVisual C# Express Edition落としてきます
113:デフォルトの名無しさん
07/08/19 14:24:36
Cからやるべきだろ
114:デフォルトの名無しさん
07/08/19 14:27:17
俺もCからがいいと思うよ
115:デフォルトの名無しさん
07/08/19 14:33:57
C#かJavaあたりだろうね。
116:デフォルトの名無しさん
07/08/19 14:38:28
俺も初めはバグを作りにくく直しやすい言語がいいと思うからC#やJavaをすすめる。
Cより型付けが強いし何かあれば例外投げて原因に気づきやすい。
あとGCがあるからメモリ周りは比較的無頓着にできる。
もちろんその後もCはやらないでいいって言ってるわけじゃないよ。
117:デフォルトの名無しさん
07/08/19 16:23:01
strncpy みたいな使いにくい関数じゃなくて、
strlcpy が標準になればいいのに。
118:デフォルトの名無しさん
07/08/19 16:34:54
NULLターミネイト位やっといてくれよとは思う
結局ラッパー関数書くハメになるし
119:デフォルトの名無しさん
07/08/19 18:11:09
void PhysicsDraw(){
for(int x=40; x<640; x=x+40) DrawLine(x,0,x,480,GetColor(64,64,64));
for(int y=40; y<480; y=y+40) DrawLine(0,y,640,y,GetColor(64,64,64));
DrawCircle(320,240,30, GetColor(255,0,0),TRUE);
}
ていうプログラムが本に載ってたんですがそのままやっても
> C:\borland\bcc55\Bin\make.exe -fDebug\dxtest.mak TARGET
MAKE Version 5.2 Copyright (c) 1987, 2000 Borland
bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -L..\DxLib -DDEBUG -nDebug -I..\DxLib;C:\Users\shiro\Desktop\MyC\プロジェクトに追加すべきファイル_BCC用\DxLib -c C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp:
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 3: 未定義の関数 'DrawLine' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 3: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 4: 未定義の関数 'DrawLine' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義の関数 'DrawCircle' を呼び出した(関数 PhysicsDraw() )
エラー E2268 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義の関数 'GetColor' を呼び出した(関数 PhysicsDraw() )
エラー E2451 C:\Users\shiro\Desktop\MyC\dxtest\dxtest.cpp 5: 未定義のシンボル TRUE(関数 PhysicsDraw() )
*** 7 errors in Compile ***
** error 1 ** deleting Debug\dxtest.obj
Make End !! (Elapsed time 0:00.296)
ってエラーが出るんです。どうしてでしょうか?
ちなみに今日プログラム始めたばかりです。
120:デフォルトの名無しさん
07/08/19 18:40:01
>>119
それはコードの一部だからコンパイルできないよ。
どっかにコードの全部が掲載してあるんじゃね。
もしくはCDに入ってるか。
つか、本文も読めばいいのに。
121:名無しさん@お腹いっぱい
07/08/20 02:31:35
質問なのですが家でc言語使えるようにしようと思って
microsoft.net Framework version 2.0 再頒布可能パッケージ
microsoft.net Framework version 2.0 SDK 日本語版
をダウンロードしたのですが友達の話によると
microsoft.net Framework version 2.0 日本語版 language pack
が必要らしいのですがmicrosoftの公式サイトに行っても見つからないのですが
どうやったら手に入るのでしょうか?
すごい初歩的な質問ですいません
122:デフォルトの名無しさん
07/08/20 02:38:44
>>121
悪いことは言わんから Visual C++ 2005 Express Edition 使っとけ。
123:デフォルトの名無しさん
07/08/20 10:45:33
C言語で.NET?
124:デフォルトの名無しさん
07/08/20 10:47:25
.NETが必要なら導入すべきだが、C言語ってだけだと別に必要ってわけでもないガナ
125:デフォルトの名無しさん
07/08/20 11:10:49
>>107
あー、それ俺も思った。
strncpy(d, s, sizeof(d))[sizeof(d)] = '\0';
↑ ↑
ここがなんかクドイ
126:デフォルトの名無しさん
07/08/20 11:39:29
>>125
くどいかどうか以前に、いろんな意味で間違いすぎ。
127:51
07/08/20 12:41:28
低レベルな質問なのですが・・
こないだ友人と話してたのですが(どちらも現場経験なし)、
if文に{}っていりますか?
ifのあと文が1つなら{}は省略してよし、と書いてあるので友人はいらないといいます。
けど私は読みやすいから{}つけたい人間です。
こんな感じです。
if(ia==0){
printf("HelloWorld\n");
}
{}はつけないほうがいいのでしょうか?
128:デフォルトの名無しさん
07/08/20 12:48:48
>>127
宗教論だな。正直どっちでもいい。
いろいろな人がソースコードを編集するなら
インデントとか括弧とかはツールで一括変換するようにすればおk
GreatCode とか
129:デフォルトの名無しさん
07/08/20 12:53:52
if(foo)
if(boo) zoo=0;
else // !fooのつもり
zoo=1;
みたいなのをやらかしそうなら、付けといた方がいいかな、程度のもんだと思う。
130:デフォルトの名無しさん
07/08/20 12:58:20
私のところのコーディングガイドでは、1行に収める場合のみ省略化としている。
つまり、
if (foo) bar();
はOKだけど
if (foo)
bar();
はダメ。
勿論、
if (foo) {bar();}
も
if (foo) {
bar();
}
もOK。
131:デフォルトの名無しさん
07/08/20 12:58:51
>>127
>if文に{}っていりますか?
つけてもつけなくても文法上間違いではない。
>{}はつけないほうがいいのでしょうか?
つけたほうがいい。
132:デフォルトの名無しさん
07/08/20 13:07:31
>>126
>いろんな意味
kwsk
133:132
07/08/20 13:10:15
あ、ありえないミス…
× sizeof(d)
○ sizeof(d)-1
134:デフォルトの名無しさん
07/08/20 13:11:37
俺は逆にカンマ演算子を使ってまで中括弧は使わないようにしてる
えへへ
135:51
07/08/20 13:11:45
>>128〜>>131
回答ありがとうございます。
どちらでもいいし、つけたほうがいいっぽいですね^^
やはりつけるようにします。
136:デフォルトの名無しさん
07/08/20 13:18:09
>>125
dが配列だと思っていいのかな?
だったら
sprintf(d, "%.*s", sizeof(d) - 1, s)
でいいじゃん。
137:デフォルトの名無しさん
07/08/20 13:25:54
>>136
0終端の為だけに態々そんな余計な文字列パースさせるの?
138:デフォルトの名無しさん
07/08/20 13:31:17
>>137
余計なメンテナンスに時間取られるくらいならありじゃね?
パフォーマンスが問題になるようなら入れ替えればいいことだし。
# まさかMS-DOSの時代みたいにprintf()系をリンクしないでサイズ節約なんて考えないだろうし。
139:デフォルトの名無しさん
07/08/20 18:58:08
>>135
文がひとつのケースでも括弧をつけたほうがミスがなくなる。
140:デフォルトの名無しさん
07/08/20 20:58:52
宗教論争になるからそろそろやめようぜ。
141:デフォルトの名無しさん
07/08/20 21:18:10
という指摘は既に >>128 でなされているわけですが
どーしても自分語りがしたい阿呆が多くてなかなか収束しません。
142:デフォルトの名無しさん
07/08/20 21:19:17
なに仕切ってんのコイツ
143:デフォルトの名無しさん
07/08/20 21:35:48
ヽ○ 小学校のころから、学級委員してました♪
|>
((
〇∧〃
/ > でもそんなの関係ねぇ!
< \ そんなの関係ねぇ!
〇/ はい!
/| オッパッピー!!
/>
チントンシャンテントン♪
チントンシャンテントン♪
144:デフォルトの名無しさん
07/08/20 22:10:27
いろんな意味で終わったネタを引っ張るなよ
145:デフォルトの名無しさん
07/08/20 22:57:39
>>135
一行のときは{}は無いほうがいいよ。
10年に一度もしないようなミスのために、読みやすさを損なうことはない。
コードを大量に書いてる人は、省略する派が多いし。
146:デフォルトの名無しさん
07/08/20 23:21:38
笑わせてくれるぜ
147:デフォルトの名無しさん
07/08/20 23:39:51
>>145
コードを大量に書いてる人ってだれ?
148:デフォルトの名無しさん
07/08/20 23:54:27
読みやすさを考えたらコードを大量に書くとか・・・
149:デフォルトの名無しさん
07/08/20 23:56:52
>>147
linux書いてる人とか、apache書いてる人とか、postgres書いてる人とか、その他いろいろ。
150:デフォルトの名無しさん
07/08/21 00:01:02
「一行でも{}をつけた方が良いか」とかの、
くだらない事を質問するような奴なら、つけた方が良いと思う。
俺はつけないが
151:デフォルトの名無しさん
07/08/21 00:42:31
>>149
その人たちは本当に読みやすさのために省略してるのか?
152:デフォルトの名無しさん
07/08/21 00:44:55
そもそも「コードを大量に書く人」のソースをlinuxやapache書いてる人として
その人たちの中じゃこっち派が多いよってのは無理があるだろう。
そこらへんのプログラマだって大量にコードは書いてる。
153:デフォルトの名無しさん
07/08/21 00:45:55
うぅ、日本語が変だ・・・orz
154:デフォルトの名無しさん
07/08/21 05:56:54
「if」って打ったらエディタが
if () {
}
って勝手に出してくる(ように設定している)ので、
消すのが面倒だし害はないし後々の面倒を予防できるのでそのまんまにしてまーす。
155:デフォルトの名無しさん
07/08/21 06:49:28
そういうのって()の中にカーソル移動すんの面倒じゃないの?
156:デフォルトの名無しさん
07/08/21 07:51:06
>>135 つけたほうがいいっぽいですね^^
質問内容は釣ネタに見えますがまだレスが流れている様ですので
プログラムは評価を受けるとかレビューとかされる場合があり
必ず中括弧'{}'で括るケースでも例えば1行しかないのに何でわざわざ中括弧で括るの?と質問された時
何と答えるかです
自分なりに定性的定量的な論旨展開で結論を出すか
ご存知かと思いますが世の中にあるコード標準とか規約とかを引用するかですね
例えば以下リンクが良く纏まっていますのでお勧めですが
URLリンク(www.literateprogramming.com)
次レスに続く
157:wolf ◆8VH3XAqjlU
07/08/21 07:51:49
>>135 つけたほうがいいっぽいですね^^
続き
中括弧で括るケースについての記述は
2.C++ Coding Standard
└─Usage Of The Implementation Language
└─Control Structures
└─Branching
└─if ... else statement
に有りますが中括弧だけでなくインデントや比較代入記号に関しても検討して下さい
if(ia==0){
printf("HelloWorld\n");
}
僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n");
}
158:デフォルトの名無しさん
07/08/21 07:54:31
定量的な論旨展開ってなんだ?
159:デフォルトの名無しさん
07/08/21 08:08:03
いきなり書き込まれてしまいまして訂正かねて
>>135 つけたほうがいいっぽいですね^^
続き
if(ia==0){
printf("HelloWorld\n");
}
僕ならこう書きます
if(0==ia)
{
printf("HelloWorld\n"); <---- 訂正
}
>>158 定量的な論旨展開ってなんだ?
あまり即答はしないほうですがたまにはソフトウエア工学的な
意見展開もいいかもしれませんので
例えば
ひと纏まりしたコードは1画面内に収まったほうがreadabilityが良いですから
160:デフォルトの名無しさん
07/08/21 08:12:00
日本語おかしい
161:デフォルトの名無しさん
07/08/21 08:19:17
「たとえば」がなにとたとえてるのかさっぱりわかりませんが。
162:デフォルトの名無しさん
07/08/21 08:23:40
比較で定数を左にもってくるというテクニックも、警告が出ないよう
にコーディングするって当たり前のことをしてれば必要ないですね。
変に技巧にはしるようなことはやめて、素直に書きましょう。
163:デフォルトの名無しさん
07/08/21 08:24:48
定量的といいつつ、定量的なことは一切書いてない件。
164:デフォルトの名無しさん
07/08/21 08:26:06
そもそも論旨は展開するようなもんじゃない
165:デフォルトの名無しさん
07/08/21 08:27:25
本当に釣りネタに見えるなぁ・・・
166:デフォルトの名無しさん
07/08/21 08:58:16
インデント論争に発展するのだけはやめような
167:デフォルトの名無しさん
07/08/21 10:24:11
>>145
どこが
> 読みやすさを損なう
のかさっぱり。やっぱ、主観的なことしかいえないだろ?
だからやめろつってんのにw
コンパイルが通ればどっちでも良いんだよ。
むしろ必要性について知らない方がダメ
168:デフォルトの名無しさん
07/08/21 10:25:24
>>151
そういう人たちは複雑になるんで、やはり規則性を持った記述をしているため
書いたり書かなかったりみたいな、ことはしてないはず。
169:デフォルトの名無しさん
07/08/21 10:41:52
>>168
書いたり書かなかったりしていますが何か。
// 書かないケース
if (foo) bar();
// 書くケース
if (foo) {
bar();
}
170:デフォルトの名無しさん
07/08/21 10:47:34
scanfだと入力後エンター押す必要がありますが
画面に入力した瞬間から反映される関数ってありますか?
171:デフォルトの名無しさん
07/08/21 10:50:15
>>170
標準ではありません。環境依存になりますが、例えばcursesなどのライブラリを使えばできないわけではありません。
172:デフォルトの名無しさん
07/08/21 10:51:10
あるいは、{ } が不要な1文のみの場合、
if() の後ろにそのまま続けてifと同じ行に書いていたり。
だから読みづらいだの主観的な意見はナンセンス。
自分が思うとおりに動作するように記述できて、コンパイルが通れば良し。
173:デフォルトの名無しさん
07/08/21 11:04:53
読みづらさをないがしろにする意見はナンセンス
174:デフォルトの名無しさん
07/08/21 11:08:07
読みづらいなんてのは主観なんだから放っておけばいいさ。
読みにくいという指摘なら、話を聞かないでもないが。
175:デフォルトの名無しさん
07/08/21 11:12:10
読みにくさは主観じゃないの?
176:デフォルトの名無しさん
07/08/21 11:14:40
客観的立場に立とうとした表現だね。定量的ではないが。
177:デフォルトの名無しさん
07/08/21 11:14:52
誘導
コーディングトラブルの約70%はif文などでの{}省略
スレリンク(tech板)
178:デフォルトの名無しさん
07/08/21 11:16:12
>>173
だからその読みづらいって主観が個人的なものでナンセンスだって言っているんだが?
人それぞれで、括弧があれば読みづらい、なければ読みづらいとか言われても
んじゃどっちだよ?って争いになるから、括弧の必要性を理解した上で
自分が思う通りに処理するソースがコンパイラに通ればそれで良いだっつってんだよ、バカかてめぇはw
179:デフォルトの名無しさん
07/08/21 11:22:53
括弧がなくても通るからって理由でつけるつけないをわざわざ
一個人の読みやすさという客観的ではない曖昧な基準で話を進められても困るだろ。
とりあえず、オープンソースのように、他者と交互にやりとりしている人たちのソースを見て
参考にするのも良いだろ。自分だけが編集するソースならどっちをとろうが個人の自由。
180:デフォルトの名無しさん
07/08/21 11:24:39
どっちでもいいけどソース内で統一されてれば読みやすい
181:デフォルトの名無しさん
07/08/21 12:05:16
>>171さん
例を教えてください
お願いします
182:デフォルトの名無しさん
07/08/21 12:28:52
>>181
例としてcursesライブラリを挙げていますが。
183:デフォルトの名無しさん
07/08/21 12:58:43
ifの括弧についてもれがまとめるからもうこの話題はおわろうぜ。
[結論]
ifに括弧はつけなさい。
[理由]
つけてもつけなくてもいい文法が問題だけど
このスレだけでも大半の人間がどちらでもよい、又はつけたほうがいい
というんだからつけなさいYO!
可読性なんてものは人それぞれ違うんだから議論自体が無意味。
もし{}つけたら効率が落ちるんなら
あんたのプログラムif文使いすぎ。作り直しなさい
{}つけるのにそんな面倒か?
なんでそんなにつけるのに反発するんだ?
YOU!つけちゃいなYO
以上まとめでした
184:デフォルトの名無しさん
07/08/21 13:08:18
if(bFlag) i++;
これとか括弧付けるだけ無駄だろ
185:デフォルトの名無しさん
07/08/21 13:11:48
んじゃ、1行纏め。
・迷ったらつけとけ。つけないなら理論武装しておけ。
186:デフォルトの名無しさん
07/08/21 13:15:49
>>185
先生ノ >>184に「なんで無駄な{}つけてんだ!」ってからまれたら
どういう理論武装しておけばいいですか?
187:デフォルトの名無しさん
07/08/21 13:35:18
>>186
日本語読めますか? >185には「つけないなら」と書いてあるのですが。
188:デフォルトの名無しさん
07/08/21 13:37:10
>>187
じゃあ「つけないなら」どういう理論武装しておけばいいですか?
189:デフォルトの名無しさん
07/08/21 13:38:48
俺は括弧もゴムも付けない派
190:デフォルトの名無しさん
07/08/21 13:39:34
武装できるような理論があればそもそも論争は起きん
191:デフォルトの名無しさん
07/08/21 13:43:31
理論武装しないならつけとけw
192:デフォルトの名無しさん
07/08/21 13:44:57
なぜ?
193:デフォルトの名無しさん
07/08/21 14:16:00
>>184 誰がそういうのにも必ず付けろって言った?だからそういう議論は
相手を罵倒したり屁理屈が横行するからやめろつってんのに、うざっ
所詮夏厨か
194:デフォルトの名無しさん
07/08/21 14:35:00
>>182さん
ぐぐったら理解できました
ありがとうございました
195:デフォルトの名無しさん
07/08/21 14:42:11
なんで>181は自分の環境を書こうとしないのだろう……
196:デフォルトの名無しさん
07/08/21 16:20:33
>>195
国家機密なんです(><)
197:デフォルトの名無しさん
07/08/21 17:42:35
Windows XPのGUIのプログラムをc言語で作りたいのですがどうすればいいですか?
198:デフォルトの名無しさん
07/08/21 17:44:55
>>197
教えたいのはやまやまですが国家機密なんです。
199:デフォルトの名無しさん
07/08/21 17:45:06
>>197
どう、とは?
環境の話なのか、前提知識の話なのか、
それともそれらはクリアしてて、コーディングの話なのか。
200:デフォルトの名無しさん
07/08/21 18:15:47
>>197
まず、Windows NT系の入ったパソコンを用意します。
201:デフォルトの名無しさん
07/08/21 18:42:03
次に、VCを違法コピーします。
202:デフォルトの名無しさん
07/08/21 18:43:43
>>155
もちろんエディタが()の中にカーソルを勝手に移動させまーす。
あと、そこに加えて{}の中にマークをつけるので、
()と{}の中にキー一発で飛べるようにしてまーす。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5371日前に更新/232 KB
担当:undef