[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/31 10:23 / Filesize : 243 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


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

【初心者歓迎】C/C++室 Ver.49【環境依存OK】



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

240 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 23:45:33 ]
>>238
if (s[0] == 'c') return 1;
if (s[1] == 'c') return 2;
if (s[2] == 'c') return 3;
...and so on.

241 名前:デフォルトの名無しさん [2008/02/22(金) 23:50:48 ]
>>234
学校の宿題は自分でやれよ。屑

242 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:02:06 ]
>>238
それ以外に方法はstrchrを使用するぐらいしか思いつかない
(strchrもおそらくは、中で同じようなことしてると思うけど)

なにが疑問なのかよくわからないので、とりえあず2通りソースを貼り付けときます
@
int i;
for(i=0; s[i] != '\0' && s[i] != c; i++);
return s[i] != '\0' ? i : -1;

A
char *p;
return (p=strchr(s, c)) != NULL ? (int)(p-s) : -1;

返ってくるのは配列の添え字ですのであしからず

243 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 00:06:01 ]
>>239  >>240
どうも、理解できました

>>242
ご丁寧にどうもありがとうございました

244 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:34:24 ]
全くコードの書き方が分からないので質問させて下さい。
C++ VS2005

略)
printf("Got: %02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4]);


buf[0]には01
buf[1]には06
buf[2]には17
buf[3]にはf3
buf[4]には34
が入る。

を文字列"0106171f34"に置き換えたい。

1.このbuf[]の中(16進数)を文字列に変換したい。

2.文字列に変換した後に、buf[0]〜buf[5]を繋げたい。

sprintとかを使えば良いみたいなのですが、どのようにやってよいか分からずに困っています。
どうかよろしくお願いします。

245 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:35:36 ]
>>244
課題を丸投げしたいなら宿題スレにいけ

246 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:37:49 ]
>>244
いや一応答えると
sprintじゃなくてsprintfだな
sprintfで連結もできます

247 名前:244 mailto:sage [2008/02/23(土) 03:51:48 ]
>>245-246
ありがとう。もうちょい試して無理だったら、宿題ではないんだけど、宿題スレで質問してみたいと思います。

248 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:54:12 ]
sprintf のヘルプ見るだけで解決だろ



249 名前:244 mailto:sage [2008/02/23(土) 08:58:16 ]
>>248
なんとか解決しました。時間かかった>< やってみれば、なんと簡単なコードって感じですけど。

ヘルプのみかたってイマイチわからないんですけど、ヘルプの見方の解説サイトとかってありませんでしょうか?

250 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 09:49:02 ]
>>249
manコマンドのことなら、man manでOK。

251 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:05:35 ]
Cをずっとやってたのですが、
VC++6.0でデバッグしてると、関数に入るだけでESPが100バイトくらい進みます
C++だとモジュール毎にスタックをこんなに食うものなのでしょうか?
デバッグ情報か何かで食ってるのですか?

252 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:06:37 ]
ローカル変数たくさん使ってるんじゃないの

253 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 10:06:52 ]
>>251
ローカル変数が100バイトほどあるんじゃなくて?

254 名前:251 mailto:sage [2008/02/23(土) 11:07:16 ]
いやひとつもないのだが・・・
家のPCでためしたけど、
関数にステップインするときはESPは4バイトしか進まないが、
そこから1step進めて、{から関数内の1行目に入るときに、
80バイトも食う
char a[100];と宣言を入れると、これが180バイトになるから、やり方は間違ってないはず
この80バイトが何なのかわからん

255 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:21:13 ]
メンバ関数とかじゃなくて?

256 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 11:22:06 ]
>>254
一時オブジェクトの置き場になってるとか?
関数の戻り値のオブジェクトを別の関数に直接渡してる場合とか・・・
アセンブラコード出させて見ても使われてなさげ?

257 名前:要は、ソースも出さずにあれこれ言われてもしらねーよっと mailto:sage [2008/02/23(土) 11:24:15 ]
まさかとは思うが、スタックオーバフローのチェックコードが入っているとか。
さもなければalloca()相当のコードが入っているとか。
あーそうそう、この場合のローカル変数は、Cのコード上現れるものに限らず
コンパイラが必要とした一時変数も含めてってことね。
例えば、構造体を値渡ししていたりreturnで戻していると作られるかもね。

258 名前:251 mailto:sage [2008/02/23(土) 11:32:53 ]
void test()
{
char a[100];
printf ("test");
}

int main(int argc, char* argv[])
{
test();

return 0;
}

コードはこれだけなんだけど。C++じゃねーな。
混合モードで見ると、これが原因らしいが、何でこんなことしてるのかな。
アセンブラわからん。

sub esp,0A4h



259 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:57:17 ]
>>249
VC++ なら sprintf とか入力して F1 推せば見れるだろ。

260 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:58:29 ]
>>258
デバッグ用じゃなくてもそうなら、
例外用のコードなのかもしれないな。

261 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:01:09 ]
>>258
手元の2005EEで試したが、リリースビルドの規定値では該当のコードは生成されない。
デバッグビルドだと生成されるが、「基本ランタイムチェック」を無効にしたら配列分だけになった。
つまり、>257の1行目だね。

262 名前:デフォルトの名無しさん [2008/02/23(土) 13:23:22 ]
C言語でポインタを値渡しするにはどうすればいいですか?

263 名前:デフォルトの名無しさん [2008/02/23(土) 13:24:01 ]
訂正
C言語でポインタを参照渡しするにはどうすればいいですか?

264 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:25:31 ]
>>263
ポインタのポインタを使う
int **p;みたいなの

265 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:25:41 ]
C言語には参照渡しの機能はありません。
ポインタを渡すことで参照渡し「っぽいこと」はできるので、
ポインタのポインタを渡せばポインタの参照渡し「っぽいこと」はできます。

266 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:26:02 ]
参照渡しだって結局アドレス渡しの糖衣みたいなもんなんじゃねえの

267 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:32:22 ]
文脈で「参照」の意味の違いを読み取れよ

268 名前:デフォルトの名無しさん [2008/02/23(土) 13:32:28 ]
サンクス



269 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:37:01 ]
C++じゃなくてCならアドレス渡しと参照渡しは同義で通じるだろ

270 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:38:30 ]
結局やってることは同じじゃねえの

271 名前:243 mailto:sage [2008/02/23(土) 13:45:44 ]
やっぱりうまくいきませんでした
何が間違っているのか、理解できません
添削をお願いしたいです
c++、Borland C++5.5.1 for win32でやっています
int strch_idx(const char* s, char c)
{
int i = 0;
while(s[i])
{
if(s[i] == 'c') goto end;
else if(s[i] == 0)
{
i = -1;
goto end;
}
i++;
}
end:
return i;
}

272 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:50:02 ]
最近はソフトウェア工学も学ばないのか

273 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:51:13 ]
>>271
>if(s[i] == 'c') goto end; 

'c' じゃなくて c では?
あと、else if (s[i] == 0) の判定をする前に while の条件で抜けてしまうかと

274 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 13:55:02 ]
>>266>>269>>270
そういう不正確な事やってると
>>207 みたいな奴が出てくるんだよ。

275 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:11:18 ]
>>274
俺はCでの話を言ってるんだぞ?
アドレス渡ししかないんだからないんだから、不正確もなにもねぇだろうが

276 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:12:17 ]
Cには参照なんてないんだからそんな言葉つかうなよ。

277 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:13:07 ]
え?マクロは参照じゃないの?

278 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:15:15 ]
C言語は基本的にすべてコピーで渡す
ポインタもコピー



279 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:15:51 ]
>>275
C には参照渡しなんてないんだよ。

280 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:18:09 ]
参照渡しがアドレス渡しの糖衣ってのは正しい
どっちかだけ知らずに語ると馬鹿なことになるけど、どっちもしっかり理解してるなら別に問題ないでしょう

281 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:20:52 ]
static_castと(int)みたいなキャストってなにかなにか違うんですか?

282 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:24:24 ]
>>281
static_castの方が用途が限定される


283 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:24:35 ]
>>280
個人がそう理解するのはかまわんけど、初心者への説明としては不親切じゃね?

284 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:25:07 ]
>>281
Cとの互換性を大事にしたいなら後者、意味をはっきりさせたいのなら前者を使うといいでしょう。

285 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:26:18 ]
>>273
実際やってみると
cuで2が、gguで3が、ijcoで4が返ってきます
これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか?
また、ご指摘を受けて、whileをdo-whileに変更しました、ありがとうございます

286 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:27:11 ]
なんでそんな単純な構造でgotoを使う必要があるのか解らん。

287 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:30:00 ]
gotoは怖くて使えない・・・
てか絶対使わないようにしてるんだが、違うのか

288 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:31:58 ]
>>280
単なる構文糖衣じゃない。
参照の参照というのは存在しないが、
ポインタのポインタというのは存在する。
これは大きな違いで、適当な教え方してると >>207 みたいなやつが出てくる。



289 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:33:55 ]
>>287
むしろ使った方が綺麗になる状況では使う。
でも、上のは break; 使えば解決できることで、
goto を使って解決すべきじゃない。

290 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:37:52 ]
>>282
>>284
当面はあまり気にしなくてよさそうですね
どうもありがとうございました

291 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:39:03 ]
>>290
いいや、気にしろ。

292 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:42:06 ]
普通は C 風のキャストは使うべきじゃない。
せいぜいクラスのテンポラリオブジェクトを作るのに関数風のキャストを使うくらい。

293 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:47:55 ]
>>292
それはキャストよりもコンストラクタ呼び出しのほうがしっくりくる

294 名前:デフォルトの名無しさん [2008/02/23(土) 14:49:30 ]
昨日質問したものですが、char * 型とchar []を判別する方法はありませんか?

295 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:52:19 ]
ソースコードを読みましょう。

296 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:54:36 ]
>>291
すいません
気にしろとだけ言われましてもなにに気を使えばいいのかわかりません

まずい点でもでてくるのか
だとかを教えていただけませんか

297 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 14:58:13 ]
キャストには色々意味があって、C言語風キャストだとそれらをすべて内包してしまって意図が掴みにくい


298 名前:デフォルトの名無しさん [2008/02/23(土) 14:58:20 ]
メインウインドウにBUTTONを作成するときなどで使う、
CreateWindowとCreateControlWindowはどう違いますか?



299 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:00:58 ]
>>296
C風のキャストはなんでもかんでもキャストできてしまうので、
プログラマの意図と違ってても警告が出ない

const void *p = 〜;
char *q = (char*)p; // charにキャスト・・・あれ? constも外しちゃったよ! でも警告は出ない
char *r = static_cast<char*>(p); // コンパイルエラー: static_castでconstは外せない
char *s = const_cast<char*>(static_cast<const char*>(p)); // constも外したい意図の場合はこう書く

300 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:03:54 ]
>>286-287
gotoのほうが行き先が明確になるので、理解しやすかったので、用いていますが
なぜ怖いのでしょうか
それと、「これは、s[i] == cと、s[i] == 0の判定が成されていないという事ですよね?
しかし、while関数自体は終わってるので、s[i]は判定されている
どういうことなんでしょうか? 」
これにも答えていただけると非常にありがたいです


301 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:04:05 ]
>>296
キャストというのは基本的にマズい処理。
アップキャストだけは例外的に安全だが、
それ以外は基本的にはあまりやるべきではない。

でも、実際にはどうしてもやる必要が出てくる事もある。
こればっかりは仕方が無い。
そういう時、C 風のキャストを使ってしまうと色々と問題が発生する。

・ 間違って危険なキャストをしてしまうかもしれない。
 例えば、const を付けるべきところで const を付け忘れたり。
 こういう時、static_cast なら危険な const の付け忘れがあるとコンパイルエラーになる。
 C 風キャストだと問答無用でキャストされてしまう。
 これが一番の問題。

・ キャストが原因っぽいバグが見つかった時、どこにキャストがあるのか探すのが面倒。
 C++ のキャストだと検索でキャストを行っている箇所を簡単に見つけられる。

・ キャストがあまり目立たない。
 危険な処理を行っている箇所が目立たないのは危険。
 C++ のキャストは非常に目立つ。

・ 打鍵数が少ないので気軽にキャストをしてしまう。
 C++ のキャストは打ち込むのが面倒で、キャストを本当に使うべきなのか
 立ち止まって考えるよう思考を誘導してくれるかもしれない。

・ 今行おうとしているキャストはどういうものかをあまり意識しないかもしれない。
 キャストという処理を軽く見ているのはよろしくない。

302 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:06:01 ]
>>300
gotoが必要になるのは言語の構造化能力を超えた構造が必要になる場合であって、
この場合はそういう場合でない。

303 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:06:12 ]
>>300
論理的に記述しようぜ。
「while を終了する」 と 「指定位置に移動する」 では
前者の方がより論理的だ。
論理的なコードは、一般に変更に強く、バグが出にくい。

まあ、break すらみだりに使うべきじゃないという人もいるけどね。

304 名前:デフォルトの名無しさん [2008/02/23(土) 15:07:50 ]
関数の引数で、char * 型とchar []型を判別する方法ありますか?

305 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:09:39 ]
>>304
不可能

306 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:10:05 ]
void foo(char* const& hoge);
template <size_t N> void foo(char (&hoge)[N]);

と区別できなくはない。

307 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:12:02 ]
char[N]とchar[]は別物だと思うよ。

308 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:12:33 ]
void foo(char* hoge, size_t size);
template <size_t N> inline void foo(char (&hoge)[N]) { foo(hoge, N); }

もちろん、こう実装するんだぜ。



309 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:13:12 ]
そう言う意味での char [] 型なんてそもそも存在しないが。

310 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:13:14 ]
>>285
>cuで2が、gguで3が、ijcoで4が返ってきます

その書き方はおかしい
strch_idxには引数が2つあるので、cuとかgguだけでは結果は決まらないはずだ

311 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:13:24 ]
>>300
逆。
gotoの方がどこにでも飛ばせるせいで行き先が不明確になる。

自分の書いたコードを他人に読ませることを想像してごらん。
breakならどこに飛ぶのか一目瞭然だけど、gotoだといちいちラベルを検索しないといけない。
しかもbreakなら「ループの終了」という意図が一目瞭然だけど、
gotoだとどういう意図で飛ばしたのかを考えないといけない。
そういう理由でgotoは避けられるため、安易にgotoが入っているとさらに、
「gotoを使わなければいけないどんな理由があったのか?」と考えさせることになる。

312 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:14:13 ]
int⇔floatの変換だけでも、毎回static_cast使う?
あと、コンテナの最後の要素以外を処理する時、
std::vector<T> container;
for (int n = 0; n < static_cast<int>(container.size()) - 1; ++n) container[n] = ...;
ってやる?

313 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:23:01 ]
>>312
俺はstatic_castを使う
コンテナの方は
for (size_t n = 0; 〜
って書けばいいのでは
本当は std::vector<T>::size_type の方が適切なのかもしれんが

314 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:23:54 ]
>>312
>int⇔floatの変換
うん。
>最後の要素以外を処理
unsigned使う。

315 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:31:10 ]
>int⇔floatの変換だけでも、毎回static_cast使う?
使う。

>コンテナの最後の・・・
for (std::vector<T>::size_type n = 0, size = container.size(); n + 1 < size; ++n) container[n] = ...;
ってやると思う。
符号無しの値を符号付きにキャストするのは基本的に危険だと思う。

316 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:32:52 ]
後者の場合、
if( !c.empty() )
for( size_t n=0; n<c.size()-1; ++n)
で何か問題あるのか?

317 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:34:18 ]
>>316
n + 1 < c.size() で判定すれば empty チェックは要らない。

318 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:36:12 ]
typename 忘れてた。
まあ T をそういう意味で使ってるとは限らないが。



319 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:39:01 ]
>>302 >>303
>>311での説明とほぼ同じという理解でよろしいでしょうか

>>311
gotoよりbreakを使うべきというのは、よく理解でき、納得できました
しかし、怖いというのは一体

>>310
すみませんが、もうすこし噛み砕いて説明願えないでしょうか
const char* sには、任意の文字列が入って、char cで、検索する文字を固定という事ではないんですか?
そのconst char* sにcuですとか、gguですとかが入っているので、これで十分だと考えているのですが

320 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:43:08 ]
>>319
goto はまず特定の状況でしか使われない。
それ以外で使われると混乱するし、
何のために使われているかすぐに分からないので不気味で怖い。

321 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:44:11 ]
>>319
goto は意図が不明確。
goto のあるコードを変更することになった場合、
その意図が 100% 分からなければ、
手を加えて変なことになりかねないので怖い。

322 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:44:56 ]
>>319
一番怖いのは、バグの温床になること。
コードの分かりにくさってのはバグに直結する。

323 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:47:14 ]
>>315
イテレータ使うならこうだな。
前進イテレータでさえあれば、これでいけるはず。

if(! container.empty()) {
 Iter it_next = container.begin();
 ++it_next;
 for(Iter it = container.begin(), end = container.end(); it_next != end; ++it, ++it_next) *it = ...;
}

324 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:52:18 ]
>>319
const char* s が cu でも c の方は
strch_idx("cu", 'c') とか
strch_idx("cu", 'u') とか
strch_idx("cu", 'x') とか色々指定できるわけで

325 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:53:30 ]
>>320-322
なるほど、よく理解できました
ご親切にありがとうございます
1、意図が不明で不気味で怖い
2、バグを招きやすいから怖い
この二点ですね

そして、本筋のほうもできたら説明していただきたいのですが

326 名前:デフォルトの名無しさん [2008/02/23(土) 15:53:54 ]
STLつかうとコンパイルに時間かかりますけど、クラスも多少鈍くなるんですか?

327 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:58:00 ]
そもそも while じゃなくて for 使おうぜ。

328 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 15:58:55 ]
>>326
一般に、コンパイルに時間がかかる方が、
コンパイル時にある程度処理を行ってくれているため、速くなる。
ただ、コードがあまりにも肥大してくると、
キャッシュの効きが悪くなって遅くなる事もある。



329 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:02:03 ]
>>325
いくつか修正したみたいだけど今はどうなってるの?

330 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:05:44 ]
>>324 >>329
最初から全文現すべきでしたね、申し訳ありません
#include <iostream>
using namespace std;

int strch_idx(const char* s, char c)
{
int i = 0;
do {
if(s[i] == c) goto end;
else if(s[i] == 0)
{
i = -1;
break;
}
i++;
} while(s[i]);
return i;
}

int main()
{
cout << "文字列を入力:"; char p[] = ""; cin >> p;
char c = c; cout << strch_idx(p, c);

return 0;
}
>>327
forだと、終了させるための条件が思いつかなかったので、whileにしましたが、やはりforのほうが良い理由があるのでしょうか

331 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:07:30 ]
>>330
>char c = c;
これはなによ

332 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:08:43 ]
>>330
continue した時でもインデックスが増えてくれるのと、
インデックスをなめていく操作を行っているという意図が伝わりやすいのと。

終了条件は while の時と同じでいいじゃん?

333 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:16:31 ]
>>330
goto end ってどこに飛んでるの?

334 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:17:17 ]
>>330
goto endが一個消し忘れ。

×char c = c;
○char c = 'c';

-1を返したいのは文がヌル文字だけだった場合?それとも文字が見つからなかった場合?
前者ならループのたび判定するのは無駄だから最初に一回だけ判定させたらいい。
後者ならヌルが見つかった時点でループが終わってるから中のlese-if節は判定してくれない。
最初に文字列の長さを測って最後までループが回った場合に-1を返すようにしないと。

335 名前:デフォルトの名無しさん [2008/02/23(土) 16:26:11 ]
f(x)のあとでstrlen(ch)が1になることがあります もとのソースを簡略にしました
構造体を参照渡ししてもだめでした 下は期待通りの動作をします 何がいけないのかわかりません

#include <string.h>
#include <stdio.h>
typedef struct STRDATA{ char *start; char *end;}strdata;

f(strdata x){
delete x.start;
x.start = new char [20];
strcpy(x.start,"++++++++++++++"); }


main(){
char *ch=new char [10]; strcpy(ch,"uuuu");

strdata x;
x.start=ch; x.end=ch+strlen(ch);
f(x);
printf("%s",ch);}

336 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:26:35 ]
なんで do-while になってるんだろう。
もっと単純に考えようぜ。

まず、文字を1つずつ取得していくループを書く。

for(i = 0; /* 文字列が終了するまで */; i++) {
 /* s[i] で文字を先頭から順番に走査していける */
}

んで次に、c が見つかったらインデックスを返すようにする。

for(i = 0; /* 文字列が終了するまで */; i++) {
 /* s[i] が c なら i を返す */
}

そして、検索しても c が見つからなかった場合は -1 を返す。

for(i = 0; /* 文字列が終了するまで */; i++) {
 /* s[i] が c なら i を返す */
}
/* -1 を返す */

これでおk。

337 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:29:05 ]
>>304

Cならシーキビだろ
C++か?

template<typename T>
struct IsArray {
enum { value = 0 };
};

template<typename T, size_t N>
struct IsArray<T[N]> {
enum { value = 1 };
};

template<typename T>
bool test(const T&) {
return IsArray<T>::value;
}

template<typename T>
void f(const T& t) {
if(test(t)) cout << "配列だ" << endl;
else cout << "配列じゃない" << endl;
}

338 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:29:46 ]
てか、C++ならブースト使えよか



339 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 16:30:19 ]
>>335
f の呼び出し後、ch は既に delete された後のアドレスを保持することになるから
絶対にアクセスしちゃダメ。

そもそも生のポインタで確保されたメモリを扱ってるからそういう事が起きる。
コンテナ使え。

340 名前:デフォルトの名無しさん [2008/02/23(土) 16:30:21 ]
これだとエラーで止まります どうすればいいですか

f(strdata *x){
delete x->start;
x->start = new char [20];
strcpy(x->start,"++++++++++++++"); }


main(){
char *ch=NULL;

strdata x;
x.start=ch; x.end=ch+strlen(ch);
f(&x);
printf("%s",ch);}






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

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

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