1 名前:ぬ ◆NUNUK382Dk mailto:sage [2007/12/27(木) 20:32:47 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.45【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1197090562/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
193 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 02:45:32 ] >>191 static const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, }; fout.write( data, sizeof(data) );
194 名前:デフォルトの名無しさん [2008/01/03(木) 02:58:56 ] これからは開発文字コード体系を UTF−16ベースにしないと プログラマーから嫌われそうだ
195 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 03:18:40 ] >>192 >>193 なるほど。こうすればよかったんですね。ありがとうございますm(_ _)m ・・なんか、いきなりあれですが。 今まで他の質問サイトでよく質問してたんですが、ここの方が返信早いし、 しかもここの人たちはポイントもらうためとかではなく無償で教えてくれるんですよね。。 なんかしんみり嬉しくなりました。また行き詰ったらご教授願いたいのでよろしくお願いしますm(_ _)m
196 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 07:12:59 ] www.google.co.jp/search?q=%E3%81%94%E6%95%99%E6%8E%88
197 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 14:59:39 ] >>193 なんで、staticなんですか?
198 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 15:04:30 ] >>197 よそから使う必要がなければ、見えなくするためじゃないか。
199 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 15:09:46 ] >>197 定数にするためじゃない?
200 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 15:16:31 ] >>198 いえ、なんてーか、グローバル変数でstaticなら、それも理解できるんですが…… これ、関数内の話ですよね? >>199 それって、constじゃないんですか?
201 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 15:35:24 ] >>200 constだけだと関数内では「書き換え不能」って意味だけじゃないかな? staticがついて定数になったと思うけど。 組み込みなんかだと値をROMに収めるためにはstatic constを指定してやらないと駄目だったような・・・ C++が使える組み込みなんて少ないかもしれないけど
202 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 15:36:40 ] んーとねstaticはスタック上に領域確保するのを防ぐ狙いがあったよーな 確保した領域に値をコピーする手間が省けるのでメモリと処理時間の節約になるっぽい スコープが関数内に限られた外部変数って考えるといいっしょ でもmain関数内の変数ってコンパイラにもよると思うけど実質staticじゃなかったっけ?
203 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 16:07:50 ] 私の理解が間違っているかもしれませんが……一応確認 int main() { ofstream fout("mydata.mid", ios::binary); const char data[] = {0x4D, 0x54, 0x68, /*中略*/, 0x00, }; fout.write( data, sizeof(data) ); fout.close(); otherFunction(); return 0; } みたいな形で書いたとしたら、当然、otherFunctionから、dataにアクセスすることは出来なくなるわけですから、外部から使う必要云々の話ってのは成立しませんよね。 なので、>>201 さんの言う事(前半)が理由なら、staticはいらないのではないでしょうか? >>201 (後半)と>>202 の理由については初めて知りました。 よろしければ、参考文献などを教えていただけないでしょうか? お願いいたします。
204 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 16:23:42 ] >>203 書き換え不能の「変数」と「定数」の違いがある気がすると思って書いたんだけど。 そこまで詳しくないから間違ってるかも。 Googleで「c++ const 定数」あたりでぐぐれば?
205 名前:193 mailto:sage [2008/01/03(木) 16:27:08 ] 組み込み屋なので、こういう場合static const にしちゃうんだよな。 >>201 と>>202 (最後の1行はよく知らないが)の言うとおりだよ。 非static 非const →書き換え可能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。 非static const →書き換え不能でスタックに配置。関数に入るたびに、ROMからスタックへのコピーが発生する。(処理系により異なるかも?) static 非const→書き換え可能な静的領域に配置。プログラム開始時に一度だけ、ROMから静的領域へのコピーが発生する。 static const →書き換え不能でROMに配置。コピーは発生しない。
206 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 16:27:11 ] >>203 staticが外部からアクセスできないんは文法上の話 メモリ上に変数の領域が確保されてるんやからアドレス渡せばアクセスできるんよ
207 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 16:40:08 ] >>204-206 なるほど……色々と教えてくださってありがとうございます。 どうも、組み込み系の話が必要になってきそうですね。 そこら辺の文献でも読んでみます。ありがとうございました。
208 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 16:56:44 ] このスレには滅多に書き込まないけど、ずっと読んでる。 ホントためになる話が多いよな。各人の知識経験に感嘆するぜ。
209 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:24:02 ] 初心者向けのCの本を一冊読み終わり、問題もだいたい解けるようになりました。 次に難し目の問題集を買って、それをクリアーしたらC++に移ろうと思います。 しかし、本を読んで理解して・・・の繰り返しでモチベーションが萎えて来ました。 僕は独学でパズル感覚でプログラミングの勉強をしているので CあるいはC++を使ったら何が出来るのかということが、ちょっと想像がつきません。 そこで ■ この言語で何(どういうモノ)が作れて、 現実にはどういう場で役に立っているのかというのを教えていただきたいと思います。 よろしくお願いします。
210 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:35:47 ] C/C++は汎用性高すぎて組み込みからサーバ、GUIアプリケーションまで色々としか‥‥ とりあえず「こんなソフト欲しい」って思ったら自作してみるといいお
211 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:37:29 ] >>209 何ができるのかというと、何でもできるということになる。 目標がC/C++の勉強だけだと気力も萎えるだろう。そういう時は、何でも良いからアプリを作るのが一番。
212 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:41:50 ] ここで言ってる組み込みって www.sophia-it.com/content/%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0 ここに書かれているような意味でですか? 汎用性高いとのことですが家電製品とかのシステムもC/C++で書かれていたりするんですか?
213 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:43:39 ] 釣りな感じもするけどまぁいいか。 実用的なプログラミング言語だと、言語によってできることできないことにはほとんど差がない。 どちらかというと環境の差だったり環境が用意されているかの違いの方が大きい。 なので、コンピュータ上でできることはほぼ何でもできる、と言ってよい。 でも、これだとあまりうれしくない返答だよな。 どれだけ低レベルな処理が可能かというのについては多少差があるけど、C / C++ はその方面では強い。 具体的には、オペレーティングシステム(Windows とかね)や、組み込み系(電子機器の制御、マイコン等)の プログラミングに使われたりもする。 逆に言うと C / C++ そのままだと基礎的すぎて、ライブラリとか使わないと凝ったこと、派手なことはさせにくかったりする。 ということで、提案としては、 ・OpenGL, DirectX とか使って、ゲームとか 3D CG 系で遊んでみる。 ・(英語があまり苦にならなければ) online-judge.uva.es/problemset/ で問題を解いてみる。 (ACM国際大学対抗プログラミングコンテストの問題集でオンラインで判定もしてくれる) あたりかなぁ。あるいは宿題スレの回答者になってみてもいいかもしれないよ?
214 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:44:18 ] >>209 本を読んで理解することは非常に重要だが、実際に組んで動かしてみるのはもっと重要。 理解を深める意味でも、モチベーションの意味でもな。 あと、言語だけでなく、データ構造とアルゴリズムの勉強は欠かさないように。 パズル感覚なら楽しめるはず。実践の題材を見つけることもできると思う。 題材はGUIアプリで見た目にこだわるより、 CUIでいいから、内部動作にこだわると良い。
215 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:47:48 ] >>212 C++が使える環境ではC++で書きたいな。(あくまで希望)
216 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:48:10 ] 言語を覚えたからどうこうというのがそもそもおかしい 何か目的があって言語を覚えたんじゃないのか
217 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 17:48:14 ] Gotwを見るとか
218 名前:デフォルトの名無しさん [2008/01/03(木) 18:29:23 ] CSVファイルから各行を読み込んでベクターに入れ、それをさらに大きなベクターに いれる処理は以下でよいですか? なんか、strtok()を使うやり方があるとか、','を'\0'に置換したらいいとか言われましたが、 よく分からなかったので、以下のように書いてみました。 vector<string> vec; vector< vector<string> > vec2; ifstream ifs("ファイル名文字列"); string line; while (ifs >> line) { int s1 = 0; int s2 = 0; while (s2 < line.size()) { s1 = s2; while (line[s2] != ',' && s2 < line.size()) s2++; vec.push_back( line.substr(s1, s2 - s1) ); s2++; } vec2.push_back(v); vec.clear(); }
219 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 18:45:48 ] >>210 >>211 ありがとうございます。 アプリを作る方向で考えてみます! >>213 ありがとうございます。 英語は、雰囲気でわかりますw 実践的な問題を解いてみるのは、楽しいと思います。 頑張ります。 >>214 ありがとうございます。 データ構造やアルゴリズムは、読んでて楽しいのでどんどん勉強したいと思います! >>216 いや、暇つぶしです。 今、フリーター〜無職なんで、何かやってるアピールを親にしないと・・・ 哲学とか、医療問題とか、どうでもいいものをいろいろ勉強してました。 昔、ウェブサイト作ってFLASHのACTION SCRIPTやJAVA SCRIPTとかをいじるのが好きだったんで 全く違うけどパソコン関連ってことでCをやってみたら楽しかった・・・って感じです。
220 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 18:47:01 ] >>217 何やらヒゲのおじさんが微笑んでますが 参考になりそうなサイトですね。読んでみます。 ありがとうございます。
221 名前:デフォルトの名無しさん [2008/01/03(木) 20:03:21 ] 質問させてください。 当方、すでに出来上がっているプログラムに追加・改変して別のプログラムを作るという授業を受けている学生です。 VisualStudio2005、C++で開発しています。 ちなみに、授業を受けている割にはC++についての知識は皆無です。 今作っているのはノベルゲームのような物です。 文章を表示して、キーを入力すると次の文章を出力する、という動作を行いたいのですが、キーの入力を受け取ると、文章が一気に進んでしまいます。 これを防止する為にキーが入力されても一定時間無視するという処理を行いたいのです。 そこで皆様にお聞きしたいのですが、キーの入力(OnKeyDownで取得)を一定時間(例えば10ミリ秒)無視するためにはどのようにプログラミングすれば良いのでしょうか? わかりにくいかと思いますが、どうかよろしくお願いします。
222 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:15:46 ] >>221 フラグ立てればいい
223 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:16:25 ] if( 一定時間 != true ) { キー入力; }
224 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:17:33 ] そもそも一気に進んでしまうのがおかしいのでは
225 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:19:32 ] 何をクラスにしたらいいのかの指針をください
226 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:21:02 ] 何をしたいのか書かないとエスパーじゃなきゃ無理w
227 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:38:21 ] >>225 類似オブジェクトの共通特性を抽出してクラスにすればいい
228 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:43:50 ] 「押されているかどうか」ではなく、「押された瞬間」を検知すれば、そういうことは無くなる。 >222も参考に、その方向考えてみたらどうかな。
229 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:51:25 ] >ちなみに、授業を受けている割にはC++についての知識は皆無です。 ここに誰もつっこまないのは何故だ・・・ 教えようがないじゃん 論述形式の宿題とか?
230 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 20:54:33 ] >>229 そういうもんじゃない? 情報学科卒の生徒にHelloWorldから、とまでは言わなくても、 それに類する所から始めないといけない現実。
231 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 21:57:16 ] すでに出来上がっているプログラムって吉里吉里みたいな仕様になっているのか? なんかよくわからんけどソースうpしてくれなきゃわからん
232 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 21:59:30 ] 今日はものすごく調子が悪くてとても C言語について調べる気がしないんですが。 誰かレスお願いします。
233 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:01:06 ] >>232 お前はなんについて質問したんだよw
234 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:04:47 ] www.imgup.org/iup531850.jpg
235 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:12:54 ] >>233 何かを限られた時間で作るときの目標として ゲームにこだわる必要はないんですかね。
236 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:19:07 ] >>235 どこから「ゲーム」が出てきたんだ? エスパーで答えれば 好きにしろ、人に聞くな、目標を立てるところからが勉強だ。
237 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:20:24 ] 人生相談スレではありません。
238 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 22:22:57 ] ゲームといえば、ライフゲームとスタートレックかな。
239 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:21:54 ] >>212 >家電製品とかのシステムもC/C++で書かれていたりするんですか? Cがほとんどだと思う。 ある程度メモリとCPUパワーに余裕があれば、C++も選択肢になるだろうな。
240 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:36:44 ] 組み込みはC++が多い
241 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:56:36 ] 組み込みC++ってそんな贅沢させてくれるのか? Cがほとんどじゃまいか?
242 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:02:54 ] 今は組み込みも(全体的に)だいぶ性能上がってるんじゃないか
243 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:09:06 ] コンパイラさえ対応していれば使うよ。 コストなんてどちらにせよコード次第。
244 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:28:37 ] 組み込みは一回しか経験したことないけど、一応C++だったな でもnewを使わなかったし、ベターCって使い方だったけど・・・
245 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:31:15 ] 組み込み全く知らんのだけど、newを使わない事による組み込み的なメリットって何かあるのかね?
246 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:33:44 ] 例外処理省いてバイナリをコンパクトに出来るとかそのあたりかね newは例外投げるし。
247 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:34:11 ] 性能は大分上がってるけど、16bit環境も珍しくないからな。 8bitは流石に見なくなったが。(やってるところもあるだろうが。) C++でやるかどうかは、コストよりも政治的な要素が強い希ガス。 MDAツールが使える、といった明確なメリットがなければ、 Cで押し切られそうだな。
248 名前:212 mailto:sage [2008/01/04(金) 00:43:39 ] むーそうだったのですか。 ハードウェア言語?とかいうのを使っているのだと思ってました。 ありがとうございますm(_ _)m
249 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:52:48 ] >>245 メモリが少ないのでヒープが小さくなる。その結果newに失敗する可能性があるとか リアルタイムが要求される場合に遅いとか?
250 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 00:59:08 ] >>245 普通のnew/deleteは、空き領域の断片化によってメモリ不足に陥る可能性がある。 例外はコンパイルオプションいじらないと普通は投げないんじゃないかな。 代替策として、静的確保した領域にplacement newしたり、 断片化しないように制限を付けたメモリ管理を取り入れたりと、工夫してる。
251 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 01:06:50 ] 携帯電話みたいにOSが入ってる環境ならnew(mallocも)とか使うだろうけど IOから自分で実装するような組み込みならまず使わないと思うよ。 環境によっちゃRAMやスタックの使用量を監視しながらデバッグすることだってあるし。
252 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 02:10:51 ] C++で組み込みっつったらBREWとかしか思いうかばんなぁ
253 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 02:31:05 ] >>252 組込みのソフトが何で開発されたか、なんて普通表に出てこないから。 詳しくは言えないが、おまいらの目に触れるところで C++(全部ではないが)使って作られたもの知ってるよ。
254 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 05:42:17 ] 日立(ルネサス)のはC++コンパイラだったな
255 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 10:49:14 ] 【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132 pc11.2ch.net/test/read.cgi/tech/1190261457/ からの誘導で来ました。 =========== 仕様: 1. UNIXのcronみたいに特定の時間になるとある処理を実行させる 2. そのプログラム自体はdaemonとしてずっと走り続けている こういうことをLinux上でやりたいんですが、 sleepかalertを使って、 希望の時間になったかを調べ続けるしかないですかね。 何か普通はこうやるよってのあります? 1分に1回温度を測定するプログラムです。
256 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 11:15:11 ] 現在の時刻を取ってきて、Sleepで寝かせる時間を計算すれば良いんじゃないかな。
257 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 11:18:46 ] >>255 cron使うわけにはいかないの? どうしてもプログラム内で完結したいなら、alarm()かsetitimer()だろうね。sleep()でもできなくはないけど。 残念ながら、alert()なんてのは知らん。
258 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 11:19:15 ] >>256 Sleepってなんですか?
259 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 11:35:19 ] >>256-257 レスありがとうございます。 やっぱりそうなりますか。 alertじゃなくてalarmでした。
260 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 12:11:27 ] そもそもcronのソース読めばいいじゃないか
261 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 12:19:00 ] それはめんどくせえじゃん
262 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 13:27:42 ] そもそもcron使えばいいじゃないか。
263 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 14:51:41 ] >>255 引っ越す前から見てるんだけど 時間の分解能を定義してないのはなぜよ? sleep とか alam でやれば当然誤差累積だし… 精度とか確度とかって数学の時間に習わなかったか?
264 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 15:09:03 ] 何で偉そうなの?
265 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 15:19:32 ] >>263 些末な問題だから。
266 名前:255 mailto:sage [2008/01/04(金) 17:22:32 ] >>263 引っ越し前からの長期に渡る応援ありがとうございます! 精度は1秒あればOKです。 sleepにせよ、alarmにせよ、 仕掛ける前にtime_tを取ってきて、 それから逆算してやろうかなと思っててわざわざ書きませんでした。 数学は得意です。 自分で微分を発明しました(`・ω・´)シャキーン
267 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 17:39:02 ] ライプニッツもしくはニュートン乙
268 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 18:13:59 ] 凄い奴が書き込んでたんだな。しかも前スレから。
269 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 18:45:21 ] >>263 どこに引っ越したんだ?
270 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 19:44:39 ] いや、>255が他のスレから移動してきただけのことだろ。
271 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:46:06 ] 度忘れしてしまったので助けて 引数にポインタをとる関数があるのだが このポインタのアドレスを自動変数のものに書き換えるのはNG このポインタに自動変数を代入するのはOK でいいんだよね
272 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:49:55 ] >>271 ごめん、読解できない
273 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:53:50 ] 寝ぼけてるから日本語でokになってしまったorz a(int* p) { int local = 10; //適当 p = &local; //NG *p = local; //これはどうだったっけ? }
274 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 03:59:04 ] >>273 //これはどうだっけ? OKだよ。 ってか、なんでこの程度の事が分からん。 //NG これの理由は説明できるか?
275 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 04:00:36 ] >>273 *p = local; //これはどうだったっけ? 問題ない pの指す領域に10の値が代入される pがもつ10の値と、localが持つ10の値は、それぞれ別の領域に格納されている状態になる
276 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 04:01:11 ] よくわからんが混乱してしまった、最近疲れてる予感orz あれだ、auto変数は関数から脱出した瞬間ナイナイされちゃうからな するとポインタpは意味の無いところを示してしまうのでエラーになるんだ
277 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 04:12:09 ] >>274-275 説明ありがとう 今日はもう休もうorz
278 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 08:30:54 ] 文字列から指定の文字列を省いて他の変数へコピー 例えば 文字列が入った変数 MOJI[]="aaabbbccc\0" 指定の文字列="bbb"だと MOJI→他の変数へaaaccc\0をコピー できれば aaabbbccc→ポインタ使ってMOJI自身をaaaccc\0に ってしたいんだけど、どのようにすればいい?
279 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 08:35:58 ] ドゥアブルポイントゥアァァァァ
280 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 08:57:36 ] strstrでbbb探してbbbのに続くバイトをヌル文字まで一文字ずつ前にコピー
281 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:04:56 ] void func(char * a, char const * b) { if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return; char const * p = strstr(a, b); if (p == NULL) return; char tmp[strlen(a) + 1]; sprintf(tmp, "%.*s%s", p - a, a, p + strlen(b)); strcpy(a, tmp); } char MOJI[] = "aaabbbccc"; char * b = "bbb"; func(MOJI, b); 但し、"aaabbbccc\0"はナンセンスなんで"aaabbbccc"に変更済み
282 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:06:01 ] >一文字ずつ前にコピー 馬鹿がいる。 >char tmp[strlen(a) + 1]; c99使いがいる。 # つーか、一時領域要らないだろw
283 名前:281 mailto:sage [2008/01/05(土) 09:10:17 ] >>282 確かに一時領域要らなかった。 >>278 ってことで、訂正。これでc89でも大丈夫。 void func(char * a, char const * b) { if (a == NULL || b == NULL || a[0] == '\0' || b[0] == '\0') return; char const * p = strstr(a, b); if (p == NULL) return; strcpy(p, p + strlen(b)); }
284 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:13:58 ] >>283 いや、未だc89じゃ通らないし。つーか、char const * pじゃなくてchar * pだろよ。
285 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:28:25 ] >>283 strcpyでコピー範囲が重なってるから動作が未定義になるぞ。
286 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 09:35:26 ] さらに指定の文字列は複数回出現する可能性も有るから・・・ さらに言えば指定文字列を取り除いた後に前後の文字列がくっついて取り除くべき指定文字列になる可能性も。 ex. aabbcからabを取り除くとabcになって再度abが出現。
287 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:05:44 ] ありがとうstrlen使う発想がなかったから助かりました 実はURLからime.nu/を消したかっただけなんでこんな感じでまとめたみた if(NULL!=strstr(url,"ime.nu/")){ char *buf; buf=strstr(url,"ime.nu/"); url[strlen(url)-strlen(buf)]='\0'; buf+=strlen("ime.nu/"); strcat(url,buf); }
288 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 10:27:58 ] strcatも未定義動作になるから止めれ。
289 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:18:35 ] >>276 ポインタpも関数から脱出した瞬間ナイナイされるので安全。
290 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 11:21:28 ] strcpy()で、前方への移動ができない実装ってあるんかいな。 未定義には違いないけど。
291 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:10:38 ] >>273 >p = &local; //NG これもOKだよ よく考えろ、pもローカル変数だ
292 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:32:16 ] >>291 ほう? void TestFunc(int* p) { int x = 10; p = &x; } int main(int argc, char* argv[]) { int a; TestFunc(&a); printf("%d\n", a); return 0; }
293 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 14:44:20 ] >>292 そういう話をしてるんじゃないと思うが。