1 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:39:50 ] C言語の入門者向け解説スレです。 ・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 17 pc11.2ch.net/test/read.cgi/tech/1185286631/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 94代目 pc11.2ch.net/test/read.cgi/tech/1185452895/
2 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:40:23 ] Part 1 ttp://pc8.2ch.net/test/read.cgi/tech/1146700389/ Part 2 ttp://pc8.2ch.net/test/read.cgi/tech/1153818463/ Part 3 ttp://pc8.2ch.net/test/read.cgi/tech/1160682950/ Part 4 ttp://pc8.2ch.net/test/read.cgi/tech/1162999861/ Part 5 ttp://pc8.2ch.net/test/read.cgi/tech/1165022193/ Part 6 ttp://pc10.2ch.net/test/read.cgi/tech/1167325490/ Part 7 ttp://pc10.2ch.net/test/read.cgi/tech/1170064980/ Part 8 ttp://pc11.2ch.net/test/read.cgi/tech/1171946674/ Part 9 ttp://pc11.2ch.net/test/read.cgi/tech/1173284217/ Part 10 ttp://pc11.2ch.net/test/read.cgi/tech/1174290325/ Part 11 ttp://pc11.2ch.net/test/read.cgi/tech/1176800483/ Part 12 ttp://pc11.2ch.net/test/read.cgi/tech/1178620766/ Part 13 ttp://pc11.2ch.net/test/read.cgi/tech/1179301993/ Part 14 ttp://pc11.2ch.net/test/read.cgi/tech/1181735298/ Part 15 ttp://pc11.2ch.net/test/read.cgi/tech/1182719692/ Part 16 ttp://pc11.2ch.net/test/read.cgi/tech/1184003625/
3 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:41:08 ] 3ゲト 1乙です
4 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:42:58 ] 〇∧〃 初心者からの質問? / > でもそんなの関係ねぇ! < \ そんなの関係ねぇ! 〇/ はい! /| オッパッピー!! /> ja.wikipedia.org/wiki/%E5%B0%8F%E5%B3%B6%E3%82%88%E3%81%97%E3%81%8A > 元々「オッパッピー」は卑猥な言葉の略語だったらしいが、他の芸人にダメ出しを受けて > 「オーシャンパシフィックピース」に変更した。
5 名前:997 mailto:sage [2007/08/16(木) 06:43:47 ] すみません、名前変えるのわすれてました、前スレの997です 前スレの>>998 さん返答ありがとうございます。その書き込み不可属性というのは どうやったら解除できるんでしょうか?
6 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:46:19 ] >>5 ファイルを右クリックしてプロパティを開く Windowsなら読み取り専用ってチェックボックスのがある
7 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 07:13:18 ] Cでリストとかキューとかの汎用ライブラリをガツガツ使いたかったら C++使えってことですよね? 自分で書いても良いですけど効率悪いので... 皆さんはどうされてます?自分で全部かいてます?
8 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 07:14:28 ] C++使う
9 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 08:17:50 ] テンプレートがないと辛いね。 マクロでも実装はできるけど、エレガントとは言いがたい。
10 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 08:37:31 ] >>9 Linuxでデバイスドライバかいてると マクロで実装した汎用リストがあったりするんですが それ使えるのはもちろんLinuxカーネルだけだから それの汎用バージョンみたいなのないのかなぁ...っと
11 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 08:45:30 ] そこだけ綺麗に描き直してフォークすればいいじゃん
12 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 08:47:22 ] >>10 こんなの見つけた www5d.biglobe.ne.jp/~noocyte/Programming/CMacros.html
13 名前:5 mailto:sage [2007/08/16(木) 17:30:09 ] >>6 返答ありがとうございます。 また質問なのですが、Visual C++:2005 の設定を間違えて保存などした場合、 どうすれば初期設定にもどせるんでしょうか?
14 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 17:32:21 ] C言語のスレで前スレ最後の書き込みがオッパッピー解説ってどうよ
15 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 17:56:05 ] だが、それがいい
16 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:00:46 ] 正直に言えやぁ、ほまは オッパッピー がむっちゃ好きなんやろ? 男なら絶対そうやろ?隠さんでええよ、バレとるからw
17 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:17:35 ] ツール → 設定のインポートとエクスポート → すべての設定をリセット
18 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 22:19:28 ] 整数Aは整数Bの何%であるか表示するプログラムのソースを教えてください。
19 名前:5 mailto:sage [2007/08/16(木) 22:23:27 ] >>17 レスありがとう でも戻らないorz なんかマイクロソフト公式HPに Visual SourceSafe エクスプローラのプロジェクト ペインで削除されたファイルが所属していたプロジェクトを選択します。 [ファイル] メニューで [プロパティ] をクリックし、[削除された項目] タブをクリックします。 復元するファイルを選択します。 [復元] をクリックします。 って書いてあるけど、これどうやるんでしょうか?
20 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 22:52:50 ] >>19 再インスコ
21 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 23:02:08 ] >>19 それは Visual SourceSafe がインストールされてないとどうにもならない Visual SourceSafe エクスプローラは Visual SourceSafe の本体の一部だしな っつーか その「書いてあるけど、」の部分は SourceSafe の中に格納したデータを削除した時に SourceSafe の中の「ごみ箱」的な場所からデータを復元させるための手順なんだが この際再インスコに同意しておく
22 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:11:51 ] int *p = a; のaはaの配列の先頭を指しているらしいですよ
25 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:16:54 ] >>23 じゃあどんな高次元配列(?)でも[i][j]をポインタで表すのに[i*4+j] と共通してるんですか?なんか悩んでる内に[i*4+j]を覚えてしまった。 分からないのならまるおぼえしてしまおうかなw
26 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:27:40 ] まさか。その4はどこから出てきたと思ってるんだ
27 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:51:08 ] こんにちは。次の職場で使うため、C言語の勉強をしているものです。 入門書を一通り読み、簡単なアプリも幾つか作りましたが、 今ひとつ他人のソースを追うのが苦手です。 そこで、数読んで慣れようと考えました。 もしご存知でしたら、ソースを沢山読めるサイトを教えていただきたく。
28 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 11:55:24 ] www.google.com/codesearch?q=lang%3Ac
29 名前:22 mailto:sage [2007/08/17(金) 12:08:01 ] 配列[i][j] とすると ポインタ[i * jの要素数 + j]ですよね。 考えてもさっぱりなんで公式として覚えてしまおうと思います。
30 名前:27 mailto:sage [2007/08/17(金) 12:17:12 ] >>28 ライブラリやフリーのソースについては、 コードリーディングという本で読んでみたのですが、 規模が大きすぎる&仕様がソースのみで、今ひとつでした。
31 名前:22 mailto:sage [2007/08/17(金) 12:23:57 ] [i * 型の使用バイト数 * j]かもしれませんね。
32 名前:デフォルトの名無しさん mailto:sage [2007/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 mailto:sage [2007/08/17(金) 12:58:27 ] なるほど、そういうことっすか。ポインタに配列を代入した場合、 2次元配列をポインタでを表す場合、感覚で言うと繰り上げないでそのまま数を加算 するんですね。
34 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 13:08:14 ] >>23 int *p = a じゃ警告出るだろ。 a[0] か *a か (int*)a じゃないと。
35 名前:22 mailto:sage [2007/08/17(金) 13:10:17 ] 日本語変だorzエスパー読みしてください
36 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 13:13:52 ] >>34 そうだな。スマン
37 名前:19 mailto:sage [2007/08/17(金) 14:03:38 ] サイスコして復活したのはいいけど、こんどはソースいじって上書きしようとしても アクセス権限がありません、管理者に許可をもらってください。ってでる どうしたらいい?
38 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 14:07:09 ] あー ものすごくアレだ もしかしてVista使ってて VisualStudioにまだ公式Vista用パッチ当ててないか ソースを\Program Files\の下に保存かけてしまってる とか なんか
39 名前:19 mailto:sage [2007/08/17(金) 14:32:53 ] >>38 それかぁああああ!!! どうしたらいいかおしえて1おねがい!おしててうhw
40 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 14:55:58 ] C言語と関係ないし、内容も別スレで聞いたほうが早いと思うから それ以上はVisualStudio関連スレでやって下さいな。
41 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 14:59:10 ] >>39 ラスト。これ以上は判らんスよ MSのサイトで 2005 update SP1 vista で検索しとけば大概わかるっしょ あとは別スレで
42 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 17:41:01 ] この質問してたヤシが30過ぎたおっさんだったら失笑してしまう。
43 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 23:10:09 ] >>42 30過ぎの女性だとしても苦笑もんだな。
44 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 23:53:28 ] 図に描いてみればすぐわかるんだけど、文章で説明するのは難しいね。
46 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 00:01:34 ] こんな俺におすすめのCの教科書を教えてくれまいか。 ・Javaはそれなりにやってる。 ・Cは「触ったことある」レベル。ポインタのポインタって頭破壊する気? マクロとか#defineぐらいしか知りませんが? ・内容は多少ハイレベルでも大丈夫、というかみっちりやってくれる本の方が嬉しい。 ・演習がしっかりある奴がいい。むしろ多少重いぐらいで丁度良い。 お願いしますだ
47 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 00:52:41 ] >>46 規格書。 ・プログラミング初心者向けではない。 ・それを知るために読むのだろ。 ・内容はハイレベルだが漏れもなければ間違いもない。 ・世の中の全てが演習のテーマだ。
48 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 01:07:08 ] >>47 それ以外で何か頼むw 規格書もいつか読むんだろうけどさ・・・
49 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 01:55:23 ] >>46 C++だけど「独習C++」なら持ってる。演習付き。 これのC版はどうだろう?(俺は読んだことないけど) 書店で片っ端から開いてみたら? ところで、ポインタのポインタで頭破壊なら、二次元配列でも頭破壊か?
50 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 03:29:35 ] >>49 独習Cは書店にあったなー。平積みだったし、定評ある本なんだろうなやっぱり。thx 2次元配列は大丈夫、かな? ポインタで要素にアクセスしようとするのは慣れないけど。 基本的に、ポインタ周りの使い方と理解が全くだめ。Javaにポインタがないからだねw 参照という意味ではJavaでも無意識で使ってるのは確かだけど、Cだときっちり意識して使わないと駄目な感じに見える・・・
51 名前:デフォルトの名無しさん [2007/08/18(土) 04:15:36 ] 今 C言語勉強中で一通り超基礎を終わらせたのですが教えてください>< int ia; while(ia != -999){ scanf("%d",&ia); } これを実行させて入力時に「a」とかを入れると無限ループするのですが なぜでしょうか? もちろんchar型ではないのでこんなんしたらダメだと思うんですが a のアドレスが ia に代入されるんだったら-999じゃないから 無限ループにならずにまた入力になると思ったんですが・・ なんでだろぅ・・
52 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 04:24:30 ] www9.plala.or.jp/sgwr-t/c/sec07.html > 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 名前:デフォルトの名無しさん [2007/08/18(土) 04:30:09 ] >>52 超すばやいお返事&回答ありがとうございます(@w@ なるほど・・これをすると入力を永久に受け付けなるのですね しかもサイトまで教えていただいてありがとうございます! このサイトいいですねw勉強してきます
54 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:22:34 ] >>52 だからそのサイトは地雷だって。果てしなく間違いが見つかる。
56 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:25:29 ] >>54 馬鹿もん、0割る100は0だ。
57 名前:51 [2007/08/18(土) 06:28:18 ] すいません^^; >>54 は 51です。名前入れ忘れました。
58 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:29:06 ] >>57 別に誰でもいいから自分宛のレスを読んでレスしてから言い訳しろ。
59 名前:51 [2007/08/18(土) 06:33:35 ] あぅ・・すいません。言い訳じゃなかったのですが つw;) 今 0/100やっても大丈夫でした^^;申し訳ありません。 学校でCOBOLとC、同時にやってるのでごっちゃになってしまいました。。 (COBOLは0を割ると無限ループになっちゃうので・・) 一回試してから聞くようにします^^;ごめんなさい
60 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:41:01 ] >COBOLは0を割ると無限ループ そうだっけ? どうでもいいけど常識的には有り得ないんだけど。
61 名前:51 [2007/08/18(土) 06:42:56 ] >>60 あぅ、うちの学校のホストだけなのか´ω`; GS−8200って富士通のホストです
62 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:46:09 ] うぁはは、COBOLってすげー。 -- COBOL アプリケーションプログラムを強制終了するには、2 通りの方法がありま す。 方法 1 0 で 0 を割る COBOL アプリケーションプログラムを作成します。
63 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:46:36 ] 例外ベクタの飛んだ先にHLTが埋め込まれてるんじゃないの。 古代の処理系ならありがちだよ。
64 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 06:50:28 ] ゼロで除算する事が問題になるのはよく聞くけど ゼロを除算する事が問題になるなんて聞いたこと無いな
65 名前:51 [2007/08/18(土) 06:54:47 ] あ!ほんとだ 100/0にしたらコンパイルエラーになった。 完全に私の覚え間違いでした・・ちょっとROMって勉強しなおします・・
66 名前:デフォルトの名無しさん [2007/08/18(土) 10:31:49 ] C言語を勉強する前に身につけておかなければならないことは?
67 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 10:35:22 ] >>66 そういう頭でっかちの考え方を捨てること
68 名前:デフォルトの名無しさん [2007/08/18(土) 10:37:58 ] 基本スペックは中卒+パソコンオタクです
69 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 10:46:27 ] なんだかんだ言っても、コンピュータの仕組みを知ることも重要だよね。 人によってはコード、文字列を入力しているようにしか思えないだろうけど 汎用電子計算機に処理してもらっていること、どのように処理されているのかとか。 そういうのを知ると、より適切なプログラミングが出来るようになる。
70 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 11:12:26 ] >>55 なんか、そのサイトの作者が自作自演で宣伝してるんじゃないかってかんぐりたくなるな。
71 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 11:19:22 ] だとしたらかなり高度な自演だなw
72 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:06:55 ] 〇∧〃 初心者からの質問? / > でもそんなの関係ねぇ! < \ そんなの関係ねぇ! 〇/ はい! /| オッパッピー!! /> 全部わすれておっぱっぴー!
73 名前:デフォルトの名無しさん [2007/08/18(土) 20:29:38 ] 一つ質問があります。よろしくお願いします。 realloc()についてなんですが、このメモリ領域拡大縮小関数の P186の定義を見てあきれたんですが、 新規にメモリを確保して、memcpy()で内容をコピーしてるんですが 領域を縮小するときはともかく、領域を拡大した場合、 元のメモリ領域の外までコピーしていますよね。 これってエラーにならないんですか? 確かに書き換えているわけではないので 問題ないのかもしれませんが、これじゃメモリを別アプリから覗き見放題じゃ ないですか。本当のところどうなんでしょうか。単にわたしの資料が古いだけかな。 それと今、C++でrenew()みたいな関数作ろうと思ったんですが、 元のメモリ領域のサイズがわからないので難儀しています。 何かよい解決策がありましたらご教授ください。
74 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:31:22 ] P186って、なんのページ?
75 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:37:50 ] こっちが呆れた。
76 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:40:54 ] 標準ライブラリって仕様は統一されてても実装は処理系依存じゃ?
77 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 20:58:29 ] >>76 標準の話じゃなくて、なにかの本のP186に載ってる実装例の話でしょ。
78 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:03:54 ] P-186号文書
79 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:04:23 ] 文字列がABCDEFG・・・みたいに続いていて 2文字目だけコピーするまたは3文字目から5文字目をコピーするといった方法ありますか? strcpy()だとできない・・・
80 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:07:36 ] memmove, memcpy, strncpyとか
81 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:14:25 ] >>81 そりゃエラーにならんだろう 範囲外を書き換えているわけじゃないし
83 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:26:36 ] >>74 オッパッピーのピーだよ、きっと
84 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 21:29:43 ] >>82 やっぱりそうですか。了解しました
86 名前:79 mailto:sage [2007/08/18(土) 22:00:39 ] >>84 サンクス!なんとかできた
87 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:30:44 ] 84、87は初心者か、悪意のある上級者だろうな。
89 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:36:04 ] >>88 84が初心者(というか、自称初級者)で87が悪意のある(というか、臍曲がりの)上級者かと。
90 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:43:04 ] >>73 realloc()の返り値は、渡した引数と必ずしも一致していない。 必要なら、別の領域を探してきてそちらに移す。 というか、 >>これじゃメモリを別アプリから覗き見放題じゃないですか。 物理アドレスと論理アドレスの違いを勉強してくれ。
92 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 23:49:34 ] >>79 90が普通の書き方だけど、Windows環境なら、windows.hをインクルードして、 lstrcpyn()を使う方法も。
93 名前:87 mailto:sage [2007/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 mailto:sage [2007/08/19(日) 00:07:12 ] >>93 >strncpy()の仕様を覚えるくらいならsprintf()を使いこなした方が 両方覚えるのが良いかと思います。後回しにするのならまだしも、 少なくともこの時点で切り捨てる必要は無いでしょう。 両方知れば、使い分ける事ができますから...
95 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 00:07:46 ] >>93 覚えるのは「strcpy()の長さ制限のあるバージョンがあったな」ってくらいでいいでしょ。 使うときは、仕様を確認すればいい。
96 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 00:15:29 ] strncpyはstrcpyに比べて異常終了しにくいので、まあともかく早く 動かしたいときには、よさそうな気もするけど、データの異常に気づかない 可能性があるのでおすすめではないです。 sprintは普通に重い処理だからスピードとか気にするところでは 避けたいですが、まぁ使いやすいっちゃ使いやすいですね。 memsetで初期化するのも褒められたやり方じゃないよな。
97 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 00:20:53 ] >>96 strncpy()でデータ異常に気づかないって、どういうケースで?
98 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 00:22:24 ] sprintfは「書式を指定する」てところに、特徴があるので、 その様な状況ではsprintfが適切でしょ。 対して,strcpy,strncpyは文字列のコピーが目的の関数ってことで、 >>79 の様なケースでは、関数本来の目的にあってるかと思う。
99 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 00:26:17 ] strncpy()は、コピー先の後ろを0で埋めるという仕様があるので、 strncat()を使ったほうが速度的には有利だけど、書き方が直感的ではなくなる。 dst[0] = '\0'; strncat(dst, src, n);
100 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 00:26:50 ] >>97 文字列終端の'\0'を忘れるケースがありますね。