- 1 名前:デフォルトの名無しさん [2008/02/20(水) 12:33:41 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.48【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1202141921/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 376 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:50:41 ]
- >>369
そもそもnew[]したものをdeleteするとどうなるかは未定義。 そういう挙動になったという話は、たまたまその実装ではそうだったということでしかない。
- 377 名前:231 mailto:sage [2008/02/23(土) 17:51:43 ]
- 今更ですが>>231のようなことをした時に
MyArrayの方はデフォルトコンストラクタか引数を省略できるコンストラクタを 呼んでいるようなのですが、これのタイミングが分かりません。 コンストラクタを通過するそぶりもないし、一応初期化はされてるっぽいし・・・ 特にデストラクタのタイミングも分からないのが心配です。 いつ開放されるんでしょうか?
- 378 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:54:33 ]
- >>377
どこかでnew[]やdelete[]しているだろ?そのときだ。
- 379 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:04:57 ]
- >>375
newで割り当てたものはdelete、new[]で割り当てたものはdelete[]で解放します。参照の深さは関係ありません。
- 380 名前:デフォルトの名無しさん [2008/02/23(土) 18:12:04 ]
- 終端をセットしたいのですがどうやったらいいですか? コンパイルが通りません
main(){ char *ch=new char [50]; char **start, **end; start=&ch; //これは成功します end=&&ch[20]; // end=&(ch+20); }
- 381 名前:デフォルトの名無しさん [2008/02/23(土) 18:24:57 ]
- ch と &ch[0]は同じアドレスを表しますよね 20個目のアドレスは、&ch[20]ですよね
それを参照渡ししようとしたら&&ch[20]のはず・・・
- 382 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:26:38 ]
- char * chend = &ch[20];
end = &chend;
- 383 名前:デフォルトの名無しさん [2008/02/23(土) 18:33:33 ]
- >>382
コンパイルはできましたが、startと動作が違うようです main(){ char *ch=new char [50]; strcpy(ch,"abcdef"); char **start, **end; start=&ch; char * chend = &ch[20]; end = &chend; printf("%c\n", ((*start+1)[2]) ); printf("%c\n", ((*end-5)[2]) ); }
- 384 名前:デフォルトの名無しさん [2008/02/23(土) 18:34:48 ]
- 間違えました 20個を定義していませんでした
これだとうまくいきました サンクス char * chend = &ch[6]; end = &chend; printf("%c\n", ((*start+1)[2]) ); printf("%c\n", ((*end-5)[2]) );
- 385 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:38:15 ]
- なぜ「end = &&ch[20];」というか「end = &(&ch[20]);」ができないかは理解しておいてね。
- 386 名前:デフォルトの名無しさん [2008/02/23(土) 18:41:41 ]
- 再使用できるように動的確保したら複雑になってきました・・・
main(){ char *ch=new char [50]; strcpy(ch,"abcdef"); char **start, **end; start=&ch; char **chend =new char *; *chend=&ch[6]; end = &(*chend); printf("%c\n", ((*end-5)[2]) ); }
- 387 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 18:43:04 ]
- 先ずお前はnewを使うのをやめろ。話はそれからだ。
- 388 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 19:53:27 ]
- これはひどい
- 389 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:04:00 ]
- 何がしたのか全然わからない
- 390 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:04:21 ]
- 何度基礎をやり直せと言ったことか
- 391 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:26:55 ]
- なぜ、再使用しようとすると動的確保することになるのかもわからない。
文章で理由を説明してほしい。
- 392 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:36:55 ]
- なるほど、stringが出来るわけだ
- 393 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 20:53:56 ]
- おまえらほんと我慢強いよな。感心するよ
俺は>>386と同レベルのコードを保守する羽目になって殺意を覚えた。
- 394 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:00:35 ]
- 我慢強いというか、読んでない
- 395 名前:デフォルトの名無しさん [2008/02/23(土) 21:02:02 ]
- C++の授業で先生が、
int main() { int i; cin>>i; double a[i]; ... というコードはC++では出来ない(やりたいならnewでやるべき)と言われたのですが、 g++とiccではできました。これってだめだけど、gccやiccの拡張機能によって できているのでしょうか?
- 396 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:04:05 ]
- >>395
C++ が変化し続けているだけの話
- 397 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:09:33 ]
- >>395
現状のC++標準規格じゃ無理。C99は可能。 C99サポートしてるコンパイラなら期待してもいい。
- 398 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:11:02 ]
- newも使うべきではないよな。いやnew[]ではなくてstd::vector。
- 399 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:13:17 ]
- C99は正直あんまやらないでほしい
- 400 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:18:40 ]
- 可変引数マクロはマジホシス
- 401 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:24:18 ]
- 0xでおk
- 402 名前:デフォルトの名無しさん [2008/02/23(土) 21:35:03 ]
- おしえてください 下から2行目を動かすとデータが壊れるのですが原因がわかりません
#include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct STRDATA{ char **st; char **end; }strdata; f(strdata x){ printf("%s",*(x.st)); } strconv(strdata *q, char **p){ char **chend =(char **)malloc(sizeof(char **)); q->st=p; *chend=&(*p)[strlen(*p)]; q->end = &(*chend);} strconstconv(strdata *q, char *p){ int n=strlen(p); char *ch=(char *) malloc(n+1); strcpy(ch,p); q->st=&ch; char **chen =(char **)malloc(sizeof(char **)); *chen=&(ch[n]); q->end = &(*chen);} main(){ strdata str; #define STR "abcdefgh" strconstconv(&str, STR); //ここをコメントアウトして一つ下を動かしても平気です //char *ch=new char [50]; strcpy(ch,STR); strconv(&str,&ch); //char *x=new char [1]; ここを動かすとおかしくなります f(str); }
- 403 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:37:15 ]
- もうお前いい加減諦めたら。
ローカル変数のアドレスを関数外に持ち出すな。
- 404 名前:デフォルトの名無しさん [2008/02/23(土) 21:39:05 ]
- char *x=new char [1]; が、なぜstrdata strを書き換えられるんでしょうか?
- 405 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:39:21 ]
- なんかまぁ・・・・・・いろいろとおつかれさん
- 406 名前:402 [2008/02/23(土) 21:45:20 ]
- おなじやつですが短くしました 下から2行目を動かすと壊れるのはなぜでしょうか
#include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct STRDATA{ char **st; char **end; }strdata; f(strdata zzz){ printf("%s",*(zzz.st)); } strconstconv(strdata *q, char *p){ int n=strlen(p); char *ch=(char *) malloc(n+1); char **chen =(char **)malloc(sizeof(char **)); strcpy(ch,p); q->st=&ch; *chen=&(ch[n]); q->end = &(*chen);} main(){ strdata str; strconstconv(&str, "abcdefgh"); // char *test=new char [1]; f(str); }
- 407 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:46:36 ]
- まず変数のスコープを勉強しよう
- 408 名前:402 [2008/02/23(土) 21:48:09 ]
- なぜコメントアウトを外すとデータがこわれますか?
- 409 名前:デフォルトの名無しさん [2008/02/23(土) 21:53:31 ]
- newやmallocの確保は、解放しない限り残るんですよね そのアドレスは参照で受け取っているので問題ないと思うのですが
参照渡しにしてもだめです f(strdata *zzz){ printf("%s",*(zzz->st)); } main(){ strdata str; strconstconv(&str, "abcdefgh"); f(&str); }
- 410 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:54:33 ]
- 基礎からやりなおせよ
- 411 名前:デフォルトの名無しさん [2008/02/23(土) 21:56:58 ]
- ヒントください
- 412 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:57:01 ]
- いいから基礎からやりなおせって。スタックとヒープの概念すら分かってないだろ。
- 413 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 21:57:11 ]
- >>409
トリップをつけてくれるとあぼーんしやすいのですがいかがでしょうか
- 414 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:00:25 ]
- スタックとかヒープとか、この際関係ないレベルじゃん
- 415 名前:デフォルトの名無しさん [2008/02/23(土) 22:02:39 ]
- より短くしました これでも外すと壊れます なぜですか?
#include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct { char **st; char **end; }strdata; f(strdata *q){ char *ch=(char *) malloc(10); strcpy(ch,"abcdef"); q->st=&ch; } g(strdata *zzz){ printf("%s",*(zzz->st)); } main(){ strdata str; f(&str); //char *test=new char [1]; g(&str); }
- 416 名前:デフォルトの名無しさん [2008/02/23(土) 22:03:36 ]
- >>409
多少手を入れて(int mainとするとか)こっちで動かしてみましたが、ちゃんとabcdefghと表示されました。 でも、newだけc++の機能をつかってるけど、あとは全部(結構年季が入った感じの)cだし、 c++のコンパイラなら、関数の戻り値を指定しないのはダメだと思うし、 mallocとnew は併用したらダメだってどこかで聞いたけどな。 いまいちやろうとしていることの意図がつかめません。 (mallocとnewを併用して、どういう状況でまずいのかしらべようとしているのか) もしc++を勉強しようとしているなら、なにか適当な本とかで勉強するのを勧めます。 Cを上記くらいご存知なら、すぐにC++も使えるようになりますよ。
- 417 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:03:53 ]
- ヒントもなにも>>403がずばり回答してるんだが。
これでもわからないなら、なんでもいいからポインタの無い言語に行ってくれ。 そして帰ってくんな。
- 418 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:08:06 ]
- >>415
なんでお前は答えを貰っても全くレスポンスを返さずに、 そんなヘドロみたいなコードを貼り続けるんだ。 頭沸いてるのか
- 419 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:08:35 ]
- >>415
これなら動く。 #include <string.h> #include <stdio.h> #include <stdlib.h> typedef struct { char *st; char *end; } strdata; void f(strdata *q) { char *ch=(char *)malloc(10); strcpy(ch,"abcdef"); q->st = ch; } void g(strdata *zzz) { printf("%s", zzz->st)); } int main() { strdata str; f(&str); g(&str); return 0; }
- 420 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:11:12 ]
- >>419
おまいやさしいな
- 421 名前:デフォルトの名無しさん [2008/02/23(土) 22:14:15 ]
- >>419
それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります 削ったのですがこれでも原因が不明です コンパイラはBCC5.5です #include <stdio.h> #include <stdlib.h> typedef struct { char **st; }strdata; f(strdata *q){ char *ch=(char *) malloc(10); ch[0]='X';ch[1]='Y';ch[2]='Z';ch[3]=0; q->st=&ch; } main(){ strdata str; f(&str); //char *test=(char *) malloc(1); printf("%s",*(str.st));}
- 422 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:17:54 ]
- >それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります
( ゚д゚) ・・・ (つд⊂)ゴシゴシ (;゚д゚) ・・・ (つд⊂)ゴシゴシゴシ _, ._ (;゚ Д゚) …!?
- 423 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:17:55 ]
- 419でどこの文字列がどう書き換えられないっていうんだ言ってみろ
- 424 名前:デフォルトの名無しさん [2008/02/23(土) 22:20:55 ]
- VCCやGCCやDMCでも実行中にエラーになります
#include <stdio.h> #include <stdlib.h> typedef struct { char **st; }strdata; void f(strdata *q){ char *ch=(char *) malloc(10); ch[0]='X';ch[1]='Y';ch[2]='Z';ch[3]=0; q->st=&ch; } int main(){ strdata str; char *test; f(&str); test=(char *)malloc(1); printf("%s",*(str.st)); getchar(); return 0;}
- 425 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:21:34 ]
- >>421
>それだと、ポインタは値渡しのため、strに渡した文字列が書き換えられなくなります wwwwwwwwwwwwwwwwwwwwwww >>419よ、これが現実だwwwwwアホは相手にするなwwwwww
- 426 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:22:15 ]
- ぶっちゃけポインタ全く理解してないだろ。
- 427 名前:421 [2008/02/23(土) 22:26:27 ]
- 誤解していましたすみません
- 428 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:28:05 ]
- さすがに・・・
初心者を抜け出した程度の俺でも酷いと思うw
- 429 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:28:08 ]
- >>424
変数testの用途が不明だったので、削除させてもらった。 #include <stdio.h> #include <stdlib.h> typedef struct { char *st; }strdata; void f(strdata *q) { char *ch = (char *)malloc(10); ch[0] = 'X'; ch[1] = 'Y'; ch[2] = 'Z'; ch[3] = '\0'; //まあ0のままでもいいんだけど q->st = ch; } int main() { strdata str; f(&str); printf("%s", str.st); getchar(); free(str.st); return 0; }
- 430 名前:421 [2008/02/23(土) 22:28:56 ]
- すみません 誤解していませんでした 書き換えられません
#include <string.h> #include <stdio.h> typedef struct { char *st; }strdata; f(strdata *x){ delete x->st; x->st = new char [9]; strcpy(x->st,"++++++"); } main(){ char *ch=NULL; strdata x; x.st=ch; f(&x); printf("%s",ch);}
- 431 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:34:49 ]
- >>430
お前が421や424で書いたコードは >printf("%s",*(str.st)); だったのになぜ >printf("%s",ch); になってるんだ?納得のいく説明を聞こうか?
- 432 名前:デフォルトの名無しさん [2008/02/23(土) 22:34:55 ]
- >>429
int main() { strdata str; f(&str); ←ここで初期化された文字列の内容、長さを変更したいんです あと変数testほ確保しても落ちないようにしたいんです printf("%s", str.st); みなさんは、>>424はまともに動きますか?
- 433 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:37:26 ]
- >>432
動かすまでもなく、まともに動かないのは分かる
- 434 名前:430 [2008/02/23(土) 22:37:28 ]
- >>335>>343>>348>>351がもともとの質問でこれを実現したいんです
- 435 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:37:36 ]
- >>430
printf("%s",ch);をprintf("%s",x.st);とすればいい。 嫌か? じゃあこれでどうだ。 #include <string.h> #include <stdio.h> typedef struct { char *st; } strdata; void f(strdata *x) { delete x->st; x->st = new char[9]; strcpy(x->st,"++++++"); } int main() { char *ch = NULL; strdata x; x.st = ch; f(&x); ch = x.st; printf("%s",ch); delete[] ch; return 0; }
- 436 名前:デフォルトの名無しさん [2008/02/23(土) 22:39:36 ]
- >>433
test=(char *)malloc(1);をはずすと上手くいきます なぜですか
- 437 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:40:58 ]
- >>436
それは上手く動いてるんじゃなくて、たまたま動いてるだけ
- 438 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:41:46 ]
- >>335
をチラ見しかしてないけどそれが動くことがとても不思議。 とりあえず期待する動作はなんなのかを日本語で書いてください。
- 439 名前:デフォルトの名無しさん [2008/02/23(土) 22:42:06 ]
- >>435
それだと始めにchが巨大に確保されていたらメモリーリークになると思うのですが
- 440 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:43:20 ]
- >>436
偶然。 あのコードでは、すでになくなったローカル変数を読み取ろうとしている。 運良くメモリ上に残っていれば、一見正しく動いているように見える。 そのtestの行は、残っていた変数の値を破壊する決定打になったのだろう。
- 441 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:43:21 ]
- >>439
思うだけだ
- 442 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:44:24 ]
- 見る気もしない。
高速スクロールで華麗にスルー。 違うお題ないの?
- 443 名前:デフォルトの名無しさん [2008/02/23(土) 22:46:11 ]
- Perlで言うところの
use LWP::Simple; sub foo{ return get('ttp://hoge.com/fuga.zip'); } これをVC++で極力シンプルにやるにはどうすればいいでしょうか? 環境は以下のとおりです。 VisualC++.net2003 Standard managedC++不使用 MFC不使用 ATL/WTL使用 STL/Boost使用
- 444 名前:デフォルトの名無しさん [2008/02/23(土) 22:46:57 ]
- >>438
バイナリ文字列 (\0を含む) の初めと終わりを構造体で関数に渡して、バイナリ文字列の内容、長さを書き換えたいんです
- 445 名前:444 [2008/02/23(土) 22:48:45 ]
- 純粋なC言語だけでそれを実現したいんです
- 446 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:49:59 ]
- >>445
… 一般的に知られている C言語の定義とは違うものを扱ってらっしゃるのですね
- 447 名前:デフォルトの名無しさん [2008/02/23(土) 22:50:53 ]
- 最終的には、C言語のみにしますけど今は実験段階なので・・・
- 448 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:52:02 ]
- >>444
なんでchとかtestとか別の変数が出てくるの? 構造体のまま扱い続ければいいでしょ。
- 449 名前:443 mailto:sage [2008/02/23(土) 22:54:26 ]
- >>443
単純にC++でネット上のものをダウンロードさせるには どうすればいいですか?って聞くべきだった orz
- 450 名前:デフォルトの名無しさん [2008/02/23(土) 22:55:14 ]
- chは現物の文字列です この初めと終わりのアドレスを構造体で渡して変化させるようにしたいんです
- 451 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:55:32 ]
- 本でも読んで出直してこいよ
本格的に他人に頼りたいなら金でも払え
- 452 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 22:59:15 ]
- 現物の文字列ってなんだよ
ただのポインタだろ str.st と等価だ
- 453 名前:デフォルトの名無しさん [2008/02/23(土) 23:01:55 ]
- たとえば、
char *ch=new char [100]; strcpy(ch, "---------"); という文字列に対して、その先頭と後方のアドレスを関数に渡して、関数側で書き換えられるようにしたいんです
- 454 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:04:50 ]
- 何にそんなもんをつかうんかわからんが
とりあえずそんなことを考える前に 入門書なりきちんと読め。 たのむから
- 455 名前:デフォルトの名無しさん [2008/02/23(土) 23:09:26 ]
- 初めの文字列が200M程度確保されていたとして作業領域も200M使うとします
このとき初めの文字列を解放するか、上書きすれば最高でも400Mしかメモリを使いません しかし、それができずに返却すると最大 200M + 200M + 200M必要になります
- 456 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:11:03 ]
- >>449
ソケット使ってカリカリやるしか思いつかん
- 457 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:11:12 ]
- >>443
手軽さならWinInet 真剣にやるならWinsock
- 458 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:13:38 ]
- >>450
435みたいに、構造体で渡した後、元の変数に代入し直せばいい。
- 459 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:15:30 ]
- もはやポインタいらんがなw
- 460 名前:デフォルトの名無しさん [2008/02/23(土) 23:19:19 ]
- 文字列ではなく、1byte変数の配列を可変長で扱いたいと。
だったら、 typedef struct { char *baka; size_t length; } aho; とでもして、構造体をやり取りすればいいだろ。 C++だったら、vector<char>、deque<char>でも使えや。
- 461 名前:443 mailto:sage [2008/02/23(土) 23:20:13 ]
- WinInetででググったらいっぱい出てきたんで調べてみる。
サンクス
- 462 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:20:26 ]
- >>443
URLDownloadToFile
- 463 名前:デフォルトの名無しさん [2008/02/23(土) 23:26:44 ]
- >>458
なぜ直接書き換えられないのかわかりません
- 464 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:29:10 ]
- >>463
こっちからしてみたら、なんで構造体を使いたくないのかわからない。
- 465 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:29:25 ]
- >>463
もっと勉強してから出直せ
- 466 名前:デフォルトの名無しさん [2008/02/23(土) 23:40:17 ]
- もともと構造体は使っていますよ あとC言語のみで動かせるようにしたいんです
開始のアドレスと長さを渡しても上と同じだと思います
- 467 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:41:34 ]
- あぼーんしたいからトリップつけてくれ
- 468 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:44:18 ]
- たぶんトリのつけ方を知らない。
「名前欄にレス番つけること」すら今日知ったっぽい
- 469 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:44:39 ]
- 釣りだろう
- 470 名前:デフォルトの名無しさん [2008/02/23(土) 23:46:32 ]
- 文字列を入力して、
表示するとき右から3文字ごとにコンマをつける方法ってどうすれば? (例:入力>>344fru38fh4tgiur 出力>>3,44f,ru3,8fh,4tg,iur) この続きお願いします・・ #include <iostream.h> main() { char a[50] ; cout <<"aに文字を入力してください>>" ; cin.getline(a, 50) ; int a_count = 0 ; while( a[a_count] != '\0'){ a_count++ ; } cout <<"aを表示します→" ; for(int i=0 ; i<a_count ; i++){ cout << a[i] ; } }
- 471 名前:デフォルトの名無しさん [2008/02/23(土) 23:48:55 ]
- これがたまたまうまく動いたりしますが、実際は間違っているから困っているんです
#include <stdio.h> #include <string.h> typedef struct { char *start ; char *end; } bin; void f(bin *x) { delete x->start; x->start = new char [3]; strcpy(x->start,"aa"); } main() { char *ch = new char [2]; strcpy(ch,"a"); bin x; x.start=ch; x.end=ch+strlen(ch); f(&x); printf("%s",ch); }
- 472 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:50:11 ]
- >>470
www.google.co.jp/search?q=C%2B%2B+3%E6%A1%81+%E3%82%B3%E3%83%B3%E3%83%9E&btnG=%E6%A4%9C%E7%B4%A2&lr=
- 473 名前:デフォルトの名無しさん [2008/02/23(土) 23:53:13 ]
- x.start=ch; とした時点で、数値がコピーされるだけになり、文字列を書き換えられなくなります
だから x.start=&ch;と参照渡しをするために 構造体を { char **start ; char **end; }に変更します そうすると上記のような現象が出ます
- 474 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 23:53:48 ]
- >>471
f(&x); ch=x.start; printf("%s",ch); でいいだろ って・・・釣られちまったよ〜〜〜〜ん
- 475 名前:デフォルトの名無しさん [2008/02/23(土) 23:56:53 ]
- >>473
fを呼んだあとのchが指す先はfの中でdeleteされていることに気づいているか?
- 476 名前:475 [2008/02/23(土) 23:57:42 ]
- ×>>473
○>>471
|

|