トップページ⇒tech
1001コメント217KB

C言語ならアタシに聞きなさい<37>

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C言語の質問スレッド37発目です。
C言語は時代遅れなんかじゃないです。
みんな大好きなんです。このシリーズの速さがそれを物語っています。

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
・comp.lang.c FAQ(英語の原文)
http://www.eskimo.com/~scs/C-faq/top.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
推薦図書/必読書のためのスレッド PART6
http://pc3.2ch.net/test/read.cgi/tech/1033207156/

・前スレ <36>
http://pc3.2ch.net/test/read.cgi/tech/1035211039/

コンパイラ、過去ログなどのリンクは>>2-5 あたり
0153デフォルトの名無しさんNGNG
>>148
まあ、間違いというか無意味だけど、
今回はstrchr()の挙動の話だから。
0154125NGNG
もうバカばっかり。バカバカバカみんなバカ。
0155デフォルトの名無しさんNGNG
>>149
'\xff' はすなわち -1 だ。
char が符号付である処理系では。
0156デフォルトの名無しさんNGNG
>>150
それなりってなんだよ。
キャストしなくても途中で致命的なエラーが発生したりはしないだろ。
0157デフォルトの名無しさんNGNG
>>125の必死な姿が目に浮かぶ。
0158デフォルトの名無しさんNGNG
>>154
なんで、あんたがヒスを起こすの?
0159デフォルトの名無しさんNGNG
125 の固定番号を引きずってる 125 もかなりの DQN
0160125NGNG
>>155-156
はいはい、揚げ足取りごくろーさん。
0161デフォルトの名無しさんNGNG
>>155
1の補数表現でも-1になるんだっけ?
0162デフォルトの名無しさんNGNG
>>152
お前は、アフォか ? その時の挙動が規定されてんのか ? って聞いてんだよ。
ちなみに言っとくけど、-1 の下位8ビットが 0xff なんてことは、規定されてねーからな。
0163125NGNG
揚げ足取り必死だな
0164デフォルトの名無しさんNGNG
>>125
顔真っ赤ですよ。
0165デフォルトの名無しさんNGNG
>>155
「符号無しの処理系において」と書いてあるの見えない ?
0166125NGNG
おまえら全員読解力ゼロのバカ
0167125NGNG
>>162
はぁ?
挙動って何?
0168デフォルトの名無しさんNGNG
125 は何も試してないだろ。黙れ。

char *strchr_a(const char *str, int c)
{
  c = (char)c;
  while (*str && *str != c) ++str;
  if (*str == c) return (char *)str;
  return NULL;
}
char *strchr_b(const char *str, int c)
{
  while (*str && *str != c) ++str;
  if (*str == c) return (char *)str;
  return NULL;
}
int main()
{
  const char * str = "abcde \xFF abcde";
  printf("str = %p\n", str);
  printf("strchr_a = %p\n", strchr_a(str, '\xFF'));
  printf("strchr_b = %p\n", strchr_b(str, '\xFF'));
  getchar();
  return 0;
}
0169デフォルトの名無しさんNGNG
あ、0xffffffffじゃなくてint直で0xffを渡したときの挙動かな?
0170デフォルトの名無しさんNGNG
>>162
「規定」というか、決まってるでしょ?

> ちなみに言っとくけど、-1 の下位8ビットが 0xff なんてことは、規定されてねーからな。

はげしく勘違いしてる予感
0171デフォルトの名無しさんNGNG
ここが質問者回答者共々厨房なのはあまりにも有名な話。
俺?もちろん厨房さ。
0172デフォルトの名無しさんNGNG
>>167
> 挙動って何?

日本語もわからんのか...。まあ、落ち着けよ。
0173125NGNG
もう、せっかく教えてやってるのに頑なに理解しようとしてないバカがいるね。
0174デフォルトの名無しさんNGNG
最初に晒されたコードはVisual C++のものみたいだけど、他の有名なライブラリのstrchrのソースでもcharにキャストしているの?
0175デフォルトの名無しさんNGNG
>>170
> 「規定」というか、決まってるでしょ?

どう決まってんの ?
0176デフォルトの名無しさんNGNG
>>173
ププッ、捨てぜりふモードに入りましたね。
0177デフォルトの名無しさんNGNG
このスレ読んでわけがわからんので100レス遡る。

他人をややオカマ口調でバカバカいう125たんと
0x111とか言った香具師のせいでこんがらがってるだけだな。
0178デフォルトの名無しさんNGNG
たぶんわかった。>>109か
0179デフォルトの名無しさんNGNG



必死な>>125がいるスレというのはここですか?


0180デフォルトの名無しさんNGNG
char *strchr(const char *str, int c)
{
for(;*str;str++)
if(*s==(char)c)
return (char *)str;

return NULL;
}

じゃだめなの?
0181デフォルトの名無しさんNGNG
>>179
ここです。
0182デフォルトの名無しさんNGNG
ちなみに125の言うことは間違ってない。
0183デフォルトの名無しさんNGNG
なんていうか、自分の考えを上手く伝えられない自分へのもどかしさも彼をイライラさせる原因に。
0184125NGNG
>>180
それじゃ駄目だって。
バカ。
0185デフォルトの名無しさんNGNG
>>174
とりあえず VC++ 6.0 では、

char * __cdecl strchr (
 const char * string,
 int ch
 )
{
 while (*string && *string != (char)ch)
  string++;

 if (*string == (char)ch)
  return((char *)string);
 return(NULL);
}

となってて、char 同士で比較するようになってる。
0186デフォルトの名無しさんNGNG
>>184
なんで?
0187デフォルトの名無しさんNGNG
よし、俺も必要派に転向だ。寝るけど。
0188デフォルトの名無しさんNGNG
確かに 125 は自分で自分の品位を下げるタイプみたいだな.
こういう奴は仮に正しいことを言ってても, 真っ先に白い目でみられんだよね ...
もう少し肩の力を抜けばいいのに...
0189デフォルトの名無しさんNGNG
>>183
それだ
0190デフォルトの名無しさんNGNG
>>182, >>184
だから、ダメな例をちゃんと挙げろよ。
0191デフォルトの名無しさんNGNG
>>175
処理系定義
0192125NGNG
>>180
あ、やっぱそれでも合ってる。
おれもバカどものせいで混乱してきた。
0193デフォルトの名無しさんNGNG
つーか、元はと言えば strchr() の c が int である事が間違ってる。
0194デフォルトの名無しさんNGNG
>>184
いいじゃん。
0195125NGNG
>>191
処理系依存つっても、普通は2の補数表現使うから
ほとんど決め打ちで考えて問題ないよ。
0196デフォルトの名無しさんNGNG
>>191
だったら、この処理系では結果は不定ですって言うのもありか ?

そうなら、c = (char)c; は不要じゃん。
0197デフォルトの名無しさんNGNG
>>185
この素直じゃないコードを書いた人の顔を見てみたい。
0198デフォルトの名無しさんNGNG
そういえばSolarisのstrcasecmpに8bitな文字列を与えるとものすごいことになるね。
0199デフォルトの名無しさんNGNG
なんでここは話題に事欠かないの。誰かネタ帳でも持ってるの。
0200デフォルトの名無しさんNGNG
>>197
どこら辺がおかしいとお思い ?
0201デフォルトの名無しさんNGNG
>>199
ごゆっくりお楽しみ下さい。
0202デフォルトの名無しさんNGNG
>>199
> なんでここは話題に事欠かないの。誰かネタ帳でも持ってるの。

たいした事ないネタに食いつく奴が (今回は >>125) が多いからだろ。
0203デフォルトの名無しさんNGNG
>>200
なんでわざわざ int ch としてるのか。
0204125NGNG
お肌に悪いからもう寝る。
バカどもは徹夜で考えてなさいよ。
つーかまず質問するまえにぐぐれ。
0205デフォルトの名無しさんNGNG
最後はネカマかよw
0206デフォルトの名無しさんNGNG
c = (char)c; となってる理由がぐぐって出てくるのかよ プッ
0207デフォルトの名無しさんNGNG
>>200
素直に一文字ずつ見ていって見つかればそこでreturn。見つからなければ(ループを抜けたら)NULLを返せばいいと思う。
0208デフォルトの名無しさんNGNG
>>199
ネタ帖は>>147に。あとは誰か補完してください。
0209デフォルトの名無しさんNGNG
>>205
>>154 この辺も萌えるよ。
0210デフォルトの名無しさんNGNG
>>147
NULLは0(全ビット0)か?を忘れているぞ。
0211デフォルトの名無しさんNGNG
>>203明日になったら分かるさ。
0212デフォルトの名無しさんNGNG
>>203
>>109
0213デフォルトの名無しさんNGNG
>>210
つか、C FAQでいいじゃん。
0214207NGNG
>>203は>>197じゃないのであしからず。
0215デフォルトの名無しさんNGNG
>>212
109は説明になってないよ。

 
0216デフォルトの名無しさんNGNG
・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
0217デフォルトの名無しさんNGNG
>>109
じゃ、ほんとは
int *str = "abcde";
って書くのが正しいの?
0218デフォルトの名無しさんNGNG
>>207
>>180 ってこと ? 大して変わらんと思うけど。
0219デフォルトの名無しさんNGNG
>>217
そうは書けないね。
0220デフォルトの名無しさんNGNG
VC++のライブラリのソースはひどいね。
マクロによってstrspnのソースになったりstrpbrkのソースになったり・・・
0221デフォルトの名無しさんNGNG
関数の引数として渡すと char、short は int に float は double に自動的に変換されるのです
0222デフォルトの名無しさんNGNG
禿しくCPU依存の悪寒
0223デフォルトの名無しさんNGNG
じゃあ結論はcharへのキャストはしたければしろ。したくなければしなくてよい。
ということでOK?
0224デフォルトの名無しさんNGNG
>>223
いや、キャストは必要。
0225デフォルトの名無しさんNGNG
第二部いきまーす
0226デフォルトの名無しさんNGNG
>>222
2の補数を採用してないCPUなんてめったにないだろ
0227デフォルトの名無しさんNGNG
strcpyの第二引数にNULLを渡してもうまく動作するなんてどこに書かれているんですか?
0228デフォルトの名無しさんNGNG
?
0229デフォルトの名無しさんNGNG
>>221
それって、昔の話では…
0230デフォルトの名無しさんNGNG
217 は阿呆か、文字リテラルと文字列リテラルは全然違うのに。
0231デフォルトの名無しさんNGNG
>>229
おまえC++と混同してるだろ。
Cは221で合ってる。
0232デフォルトの名無しさんNGNG
>>226
負数に2の補数を使ってないCPUなんてあるのか?
0233デフォルトの名無しさんNGNG
リッチーもひどい言語をつくってくれたものだな!
0234デフォルトの名無しさんNGNG
>>232
PS2のCPUとか。
0235デフォルトの名無しさんNGNG
>>233
はじめっからCは高級アセンブラって位置付けなんだから
変な期待すんな
0236デフォルトの名無しさんNGNG
>>233
モノは使いよう。
クソソースを作るやつがクソ
つーか age る程の話題ではない
0237デフォルトの名無しさんNGNG
>>231
たとえば
void hoge(char ch);
という関数があったら、intに変換されるってこと?
わけわからん。
0238デフォルトの名無しさんNGNG
>>221の意味がわからない。
解説お願いします。
0239デフォルトの名無しさんNGNG
>>235
未定義・処理系依存が多すぎるじゃん!
0240デフォルトの名無しさんNGNG
>>234
マジで?
gccとかやばいんでない?
0241デフォルトの名無しさんNGNG
0x80〜は符号拡張されるから、よくやる
n = c - '0';
みたいなのは0x80をまたいでは使えないんだね。気付かなかった。やらないけど。
0242デフォルトの名無しさんNGNG
>>224
だから、ないとまずい理由をちゃんと書け。
0243デフォルトの名無しさんNGNG
引数がint型に拡張されないと、DLLとかで困ると思うんだが。
0244デフォルトの名無しさんNGNG
>>241
だれに返事してるの?
0245デフォルトの名無しさんNGNG
1の補数表現って8bitの場合、0x00と0xFFは同じ値になるの?
Cと関係なくてスマソ
0246デフォルトの名無しさんNGNG
>>242
つーか、その話題まだ引きずるの?
0247デフォルトの名無しさんNGNG
>>244
ひとりごとだ、スマソ
0248デフォルトの名無しさんNGNG
以降

 独 り 言 禁 止
0249デフォルトの名無しさんNGNG
>>243
それは、Windowsの実装の話でしょ。
C一般の話じゃないよ。
0250デフォルトの名無しさんNGNG
>>227は放置ですか?
前スレにstrcpy(str,NULL);やstrcpy(str,0);はOKみたいなことが書かれていたんですけど。
0251デフォルトの名無しさんNGNG
>>249
でも、一般的なPC環境はWindowsだよね
0252デフォルトの名無しさんNGNG
以降

   OS依存、処理系依存禁止
■ このスレッドは過去ログ倉庫に格納されています