1 :
アウトドアおたく :
2000/10/28(土) 13:36 Cだけで書ける str*** シリーズの関数を書いてみよう。 では、今日のお題は 1.strcpy 2.strncpy 3.strstr さあどうぞ。
は?
3 :
libcのソースコード :2000/10/28(土) 14:26
char * strcpy(to@` from) register char *to; register const char *from; { char *save = to; for (; (*to = *from); ++from@` ++to); return(save); }
4 :
同じく :2000/10/28(土) 14:27
char * strstr(s@` find) register const char *s@` *find; { register char c@` sc; register size_t len; if ((c = *find++) != 0) { len = strlen(find); do { do { if ((sc = *s++) == 0) return (NULL); } while (sc != c); } while (strncmp(s@` find@` len) != 0); s--; } return ((char *)s); }
5 :
同じく :2000/10/28(土) 14:28
char * strncpy(dst@` src@` n) char *dst; const char *src; register size_t n; { if (n != 0) { register char *d = dst; register const char *s = src; do { if ((*d++ = *s++) == 0) { /* NUL pad the remaining n-1 bytes */ while (--n != 0) *d++ = 0; break; } } while (--n != 0); } return (dst); }
6 :
初心者用にいい加減なの :2000/10/28(土) 14:39
char *copy( char[]@` from[] ) { while( *from != 0x00 ) *to++ = *from++ return( to ); } 初心者にはこっちの方がわかりやすいかな?
あ まちがえた char *strcpy( char to[]@` char from[] ) { while( *from != 0x00 ) *to++ = *from++; return( to ); } なんてまちがいをしてんだ・・・ 逝こう・・・
8 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 14:49
>7 これはわかりやすい。
>>7 まだ致命的な間違いがあるんだけど・・・
初心者にはわかりやすいとか言う以前に、自分が初心者を脱出すべし
10 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 16:22
11 :
>10 :2000/10/28(土) 16:28
そーゆー問題じゃないだろ。 全部作り直しだ!
あれだけ短いプログラムでよく3カ所も間違えられるよな
>10 あんたに仕事頼みたくないな。 糞な手戻り作業多そう。
こんなもんか? char* strcpy( char* to@` char* from ) { char* p=to; while( *p++=*from++ ); return to; }
15 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 19:43
>>14 まだ間違ってる
何も考えないでCを使っているとそうなるのか・・・
char* _straccessviolation() { return (char*)(*(char*)NULL = NULL); }
const char* const _strfuck() { return "fuck"; }
18 :
>15 :2000/10/28(土) 21:14
7とかって合ってるんじゃないんですか? 14はなんでポインタ変数にわざわざ渡しているのか わかんないですけど。
19 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 21:21
char* strcpy(char* dst@` const char* src) { char* ret = dst; while(*dst++ = *src++); return ret; } char* strncpy(char* dst@` const char* src@` size_t n) { char* ret = dst; while((*dst++ = *src++) && (--n)); return ret; }
>>18 一から勉強し直せ
それから今後、プログラムを飯の種にはしないでくれ
21 :
18 :2000/10/28(土) 21:30
>20 受け渡されたアドレスを触ってるからダメなの? 7と19のってやってること一緒じゃないの?
22 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 21:47
>>18 =21
自分の手でやってみろ。結果が違うのが分かる。
それはともかく、14って何か間違ってるか? const が無いのは置いておくとして。
24 :
名無しさん@お腹いっぱい。 :2000/10/28(土) 21:50
char *strcpy( char *string1@` const char *string2 ) { _asm { MOV ESI@`string2 MOV EDI@`string1 lp_in: LODSB STOSB TEST AL@`AL JNE lp_in } return string1; }
25 :
18=21 :2000/10/28(土) 22:20
22@`23> 結果が違いますね〜。 すごいなあ。 やっぱり初心者はためしてなんぼなのね〜。 7のは戻り値が出なかったよ。 22さんはそういうのどこでわかるの?
>>25 最初はみんな初心者さっ。
ポインタを勉強すれ。
そうすればわかるすれ。
27 :
22じゃ無いけど :2000/10/28(土) 23:53
>結果が違いますね〜。 >すごいなあ。 別にすごくない、ほんの基本。 >やっぱり初心者はためしてなんぼなのね〜。 それは危険な考えです。 初心者にありがちなんだけどね。 そういう考えでプログラムを続けるとこういうヘボプログラマなります。 ------------------------------------------------------------ とりあえずコンパイル。 コンパイルの吐いた大量のエラーを修正。 エラーがでなくなったが動作が予想と違う、デバッガ起動。 それでも意味がわからない。 なんかしんないけど+1したらうごいた、さあ次のコーディングだ。 ------------------------------------------------------------ >22さんはそういうのどこでわかるの? ほんの基本なので、C言語脱初心者以上中級者未満ならばすぐにわかります。 26の言うとおりポインタの勉強をしましょう。 あと、このスレみたいにライブラリ関数を自作するのも良い勉強です そんで出来た物を上級者(エセ上級者に注意!!)に見てもらいましょう。 さらにその人に俺ならこう作るね的な物を書いてもらいましょう。 おそらく目からうろこがおちるでしょう(エセじゃなければ)
28 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 00:07
>>24 わざわざインラインアセンブラ使うメリットあるのですか?
インラインアセンブラの勉強になる。 以上。
なにいってんだか‥ 7と19の違いはポインタの勉強しても意味無いだろが 初心者惑わすのはヤメレ それともマジでそう思ってるのか?
31 :
24 :2000/10/29(日) 00:51
インラインアセンブラをサポートしてないコンパイラもあるんで 却下っ!!
自分で却下するのか?変なやつだな‥
33 :
27 :2000/10/29(日) 01:12
>30 とりあえず 7のreturn がループ内にあるのは単なる書き間違え(理解はしている)と判断 7の*to++のところとか、更新後のアドレスを返しているあたりが理解していないと判断したのでそう思いました。
34 :
名無しさん@お腹痛い。 :2000/10/29(日) 01:25
35 :
名無なさん :2000/10/29(日) 01:49
>33=27 エセ上級者発見!
>33 toがポインタだろうがなかろうが ++すりゃ値は変わるでしょ? ポインタとは関係無いよね。 7はたしかに戻り値も違うけれども strcpyに期待するものは 戻り値よりも副作用のほうでしょ? そこについてはどうよ? まさか気がついてないのか?
37 :
アウトドアおたく :2000/10/29(日) 02:02
話題になってないけど6@`7は比較の右辺に0x00って書いてますよね。 これはどうしても書きたいなら'\0'とすべきです。 0x00は通常intですので、コンパイル後の実行コードに冗長部分が できる可能性があります。 in-line asmも面白かったです。 今度は strstr も書いてみて下さい。
38 :
33=27 :2000/10/29(日) 02:43
>34 >returnはwhileの外でしょ。 ほんとだ、すんません。 インデントが無いから、whileと関数自体の}がセットであるように見えたんです。 私は1文でも必ず{}をつける派なもんで。 (ちなみに1文で{}を付けないときは一列に書きます if(!n) return;みたいに) >35 自分の事を上級者だと言った覚えはないですが? >36 >toがポインタだろうがなかろうが >++すりゃ値は変わるでしょ? この部分は私の個人的な考え方が少し入ってしまっています。 配列形式(char buf[256]とか)で宣言した物でも*(buf + 3)とかできるのは 当然なんですが、宣言が[]である以上はアスタリスクを使うべきではない、 っていうのが私の中にあったもので・・・ 理由: まず一つにstrcpyもつくれない人が初期の段階で char buf[256]; *(buf + 3) = hoge; 的な使い方をすると、後々待ちがった考えを誘発すると思ったからです。 あと、前述の「私の考え方」についての部分としては 長いコードの中で char buf[256]等と宣言した物にたいして、"*"を使うとbufがポインタ+ malloc等で動的確保 されたバッファなのか、固定長で宣言された物なのかが判断しにくいからです。(今回は当てはまらんかもしれんが) sizeof(buf)をポインタ(動的領域)に使ったり、固定値にfree(buf)をかます危険性があるからです。 (そんなのちゃんと見れば解るというのはなしですよ、実務的な意味合いで書いてますから) >戻り値よりも副作用のほうでしょ? >そこについてはどうよ? 最後に肝心な物が無いですよね、そこは初心者の方に考えていただくと。
長文になってしまった。 すいません。(長文ウゼェとか来る前に・・・)
40 :
アウトドアおたく :2000/10/29(日) 02:55
まぁまぁまぁ・・・ 36さんも気づいているなら素直に書いてあげようよ(^^; >7 from末尾の'\0'がこれではコピーされません。 コピー先は'\0'で埋まっていることもありますが そうでないこともあります。 7のコードはコンパイルしてみてうまく動くことも ありますが、それはたまたま運のいいときだけです。 >14 正しく動作します。 >15 私も14がどう間違っているのか解りません。 教えて下さい。 >18 14がtoをセーブしているのは、strcpy そのものの戻り値 として受け取ったtoのアドレスを返さなければならないからです。 だからインクリメントする前のアドレスを保存しておくんですね。 >19 完璧です。すごい。
41 :
名無なさん :2000/10/29(日) 03:10
>38 >そんで出来た物を上級者に見てもらいましょう。 とか自分で言っときながら、「自分のこと上級者と思っていない」のに 評価するのはいかがなものか? 上級者じゃなかったら見るなよ、ということ。
42 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 04:04
こんなのはどうでしょう? char *strstr(const char *big@` const char *little) { char *b@`*l; if (little || *little) return big; b = big; while (*b) { while (*big && (*big++ != *little)); l = little ; b = big; while (*b && *l && (*l++ == *b++)); if (*l) return *big; } return NULL; }
43 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 04:48
>>42 全然ダメ。0点。
大体、最初のif文は一体何だ?
ところで、俺も考えてみた。
char *strstr(char *cs@` const char *ct)
{
   int i = 0;
   while(*cs){
      while(ct[i]){
         if(cs[i] != ct[i])
            break;
         ++i;
      }
      if(!ct[i])
         return cs;
      ++cs;
   }
   return NULL;
}
どうだろう?
44 :
43 :2000/10/29(日) 04:54
いけね、iを再初期化するのを忘れた。 char *strstr(char *cs@` const char *ct) {    int i = 0;    while(*cs){       while(ct[i]){          if(cs[i] != ct[i])             break;          ++i;       }       if(!ct[i])          return cs;       ++cs;       i = 0;    }    return NULL; }
45 :
通りすがり :2000/10/29(日) 06:17
>大体、最初のif文は一体何だ? 第2引数がヌルポインタの場合を考えてあるような。 そうなると第1引数のチェックが欲しいけどライブラリじゃ assert もたいてい上手くいかないね。 安全なほうに持っていこうという気持ちは評価できる。(個人的にはね) 安全装置つけるなら、デバッグ用ライブラリと分けると親切かな。
46 :
18=22=25の初心者です :2000/10/29(日) 07:12
>40 14の意味がわかりました。 これでちょっとかしこくなった。ふふふ。
47 :
18=22=25=じつは7 :2000/10/29(日) 07:35
暴露しちゃえ。 じつは課題でした。 すんまそん。ふふふ。 ふふふ。
48 :
暴露(曝)の初心者 :2000/10/29(日) 07:37
アウトドアさん、ありがとう。 7のヌルがだめなのもわかったよ。 ふふふ。 かしこくなっちゃった。 ふふふ。
49 :
42 :2000/10/29(日) 07:53
>>43 FreeBSD 4-STABLE では第2引数が空文字列の時は第1引数を返せってあったんだけど.
そういう話じゃない? っていうか0点呼ばわりするならこれくらい解れ.
ま@`確かに俺の方が数バイトほどコードがでかくなるかもしれない.
>>45 ををっ!確かに. 第1引数を忘れてた.
あっバグ発見.
-if (*l)
+if (!*l)
return big;
やはり修行が足りないな.
文字列挿入きぼー str Aの途中にstr Bを挿入 関数名はstrinsで CでもC++でも可
51 :
名無しさんi486 :2000/10/29(日) 11:15
さげてもた Vector使うのはなしで
52 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 12:05
char* strins(char* dst@` const char* src@` const char* ins@` size_t pin) { strncpy(dst@` src@` pin); dst[pin] = '\0'; strcat(dst@` ins); strcat(dst@` (src + pin)); return dst; }
なんでこんなネタにこんなにレスが付くのかわからん。 本まるうつしのばっかじゃん あと、文字列処理書くなら漢字対応ぐらいしろよ>ALL もっと実践的で実になることきぼ〜ん
54 :
BAB :2000/10/29(日) 13:39
>53 書けねーよ。SJISだけなら良いが、JISやEUC、EBCDICの完璧な判定 なんて対応不可。 それにベンダー固有はどうするの? それとも個々に関数をいっぱい作ってここに書くわけ?
55 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 13:49
まあまあ、 そんなこともわからずに 人がプログラム書いてくれるの待ってる タイプのひとを相手にしなてもしかたないす。
56 :
名無しさんi486 :2000/10/29(日) 13:54
しかし、これって宿題だろ?
> あと、文字列処理書くなら漢字対応ぐらいしろよ>ALL こんなこと言い出すバカがそろそろ出る頃だとは思っていたが…。
58 :
53 :2000/10/29(日) 14:22
>>54 べつにベースにするコード決めれば漢字コード全部対応しなくてもよいじゃん。
(SJISならSJIS基本にして他のは変換)
>>56 だれかの宿題なの?
とりあえずネタ提供します
コンソール出力や、掲示板にカキコするときにあれば便利なやつ
機能
スペース<->タブ変換
引数
d:出力先
s:入力文字列(slenがあるので、nul終端('\0')はなくても良い)
slen:sの長さ
ntab:タブ幅(2@`4@`6@`8@`...)
戻値:dの長さ(nul終端を含まない長さ)
size_t 2ch_tab2sp(char *d@` const char *s@` size_t slen@` unsigned int ntab);
size_t 2ch_sp2tab(char *d@` const char *s@` size_t slen@` unsigned int ntab);
2ちゃんねら〜用にタブ<->全角スペース版も作ってみよう。
size_t 2ch_tab2zsp(char *d@` const char *s@` size_t slen@` unsigned int ntab);
size_t 2ch_zsp2tab(char *d@` const char *s@` size_t slen@` unsigned int ntab);
※↑関数の引数やらが気に入らないのであれば他の形式でもかまいません。
ではどうぞ。
59 :
53 :2000/10/29(日) 14:34
おっと長すぎたか。
>>57 >思っていたが…。
が、何?(藁
60 :
53 :2000/10/29(日) 15:00
>>58 良く見たら関数名
2ch_XXX
これじゃ通んないって。
_2ch_XXX
で勘弁して。
61 :
57 :2000/10/29(日) 15:16
>>53 > が、何?
その後ろは「ホントに出てきやがったか。」だ。わかったかい?
あと、ShiftJISに変換できない文字コードはいくらでもあることくらい知っておいた方がいいぞ。
ついでに、半角スペース:全角スペース:タブの幅の比ってどのくらいで変換するつもり?
62 :
>53 :2000/10/29(日) 16:33
それはね、ここに常駐してる奴が実際に興味のある レベルの話題だからさ。 もちろんアンタも含めてな。
63 :
>53 :2000/10/29(日) 16:34
アンタも自分からソース出して叩かれるのが怖い口なんだろ?(W
64 :
53 :2000/10/29(日) 16:54
>>61 >わかったかい?
わかった。…で?
>変換できない文字コードはいくらでもある
はあ?
そんなこと、ここで議論するつもり?
SJISで、てめーがいつも書くモジコードの範囲で変換できないもんでもあるんか?
変換できないのがいやなら、代わりにメタ文字でも埋め込んでおけば?
べつにそうしたきゃJISでもEUCでもEBCDICでもかまわないけどさ。
>タブの幅の比ってどのくらいで変換するつもり?
とりあえずタブ幅=4なら
4:2:1
(半角スペース:全角スペース:タブ)
でいいんじゃないの?
出力してみて具合が悪ければ変えればいいだけの話だろ。
はいはい、ここはお勉強スレなんだからつまんない喧嘩はよそでやってね
66 :
57 :2000/10/29(日) 17:27
>>65 ほい、すまんね。これで終わるよ。
>>64 つーか、俺もそこまで議論するつもりが無いから、マルチバイト文字対応にしようなんて
無駄なこと言うなって言ってんの。ShiftJISだけなんて中途半端な実装じゃ作る意味ねぇじゃん。
67 :
53 :2000/10/29(日) 17:55
>>61 確かに文字列処理には興味がある。
が、このスレのカキコ内容は、全くの無駄としか思えない。
既に存在するC標準ライブラリの、それも最も低いレベルのルーチン作ってどうする?
>>63 そうやって無意味な同意を求めるなよ。
あとでオレ自身のも出してやるから、そんときは存分に叩いてくれ。
それから、
>>54 >書けねーよ。
そう簡単に諦らめるなって。
>>65 >つまんない喧嘩
だったの?
まあ、これでやめるよ。
>>66 >ShiftJISだけなんて中途半端
そうか?
繰り返し悪いが、58@`64ちゃんと読んだ?
あんたの言う「マルチバイト文字」対応ってどんなの?
はいはい、ここはお勉強スレなんだからつまんない喧嘩はよそでやってね やめるんだったら他人に疑問投げかけないでね。
69 :
53 :2000/10/29(日) 18:22
ほれ、とりあえず作った。 size_t _2ch_tab2sp(char *cd@` const char *cs@` size_t slen@` size_t ntab) { char *d = (char *)cd; char *s = (char *)cs; char *last = s + slen; size_t ctab = 0; if (!cd || !s || !slen || ntab & 1) return 0; while (*s && s < last) { char c = *s++; if (c == 0x9) { size_t tablen = ntab - ctab; if (tablen) { memset(d@` 0x20@` tablen); /*@*/ d += tablen; /*@*/ } ctab = 0; } else { *d++ = c; ctab++; if (c == 0x0d || c == 0x0a || ctab == ntab) ctab = 0; } } *d = 0; return (size_t)(d - cd); }
70 :
53 :2000/10/29(日) 18:23
_2ch_tab2zspは上の/*@*/のある行を下に置き換えてくれ。 /*---------_2ch_tab2zsp-----------------*/ size_t i; for (i = 0; i < tablen; i += 2) { memcpy(d@` "\x81\x40"@` 2); d += 2; } /*---------_2ch_tab2zsp-----------------*/ _2ch_tab2sp _2ch_tab2zsp は長くなりそうなので省略する。
71 :
53 :2000/10/29(日) 18:42
>>68 >疑問投げかけないでね。
悪かったよ。
>>70 まちがい
>_2ch_tab2sp
>_2ch_tab2zsp
↓
>_2ch_sp2tab
>_2ch_zsp2tab
ちなみに上のソースの出力は_2ch_tab2zspを使ってみた。
72 :
名無しさん@お腹いっぱい。 :2000/10/29(日) 19:38
なんかひとりで突っ走ってる奴がいるね(^^;
>53 キミは回答者としてはここのスレは卒業だ! 次からはアドバイザで参加するか よそのスレで暴れてくれたまい。
74 :
53 :2000/10/29(日) 21:03
>>55 ほら、コード書いたから相手にしてくれよ(藁
75 :
53 :2000/10/29(日) 21:06
---------------------------------- ん? ほれ、他のやつどうした? _2ch_tab2sp _2ch_tab2zsp の別ver.でもいいが、 _2ch_sp2tab _2ch_zsp2tab も自信作できたら出してみれ。 TAB変換は、この板の住民でソースコード掲載するやつ全員に有益だぞ? このスレの最初の方の惨状を見る限り。(藁 ちなみに上のはテストコード含めて30分で書けたぞ?
76 :
53 :2000/10/29(日) 21:08
>>73 意味のある内容ならアドバイスもするけどな(藁
なんか、お勉強スレに「実用的じゃない」とか いろいろ言い出して暴走している奴がいるな。 仕事でも一人で規約を無視して突っ走りそう。
>>53 =
>>69 =
>>75 そんなもんに30分もかけるなよ。
const char* から char* にキャストするな。
tabの幅は偶数じゃないといけない理由でもあんのか?
あと全角スペースで書かれるとコピペでコンパイルできないからむしろウザい。
…このくらい相手にしてやれば満足か?
最初のほうのifにある ntab & 1ってなに? 全角の処理が面倒なので、タブが2文字単位でないと 動かないようにする手抜き?
スレの趣旨を理解できない人は書き込みを避けてください。 迷惑です。
>>53 みっともねえからそろそろ止めとけよ...
俺ははっきり言って/usr/src/usr.bin/expand/expand.cを一々
自分の手で書きたかねえよ。
そんなにやりたけりゃ、別スレでやってくれ。
それと、日本語云々でグダグダ言うぐらいなら、0x09とかじゃなく
文字列定数使ってくれ。そうすりゃクソメインフレームのろくでもねえ
Cコンパイラでも動く「かも」しれないんだからな。
>>78 俺はインデントされてねえソースなんて読みたかねえぞ。
:%s/ /^I/g してやればいいだけだろ。
82 :
53 :2000/10/29(日) 22:04
マジ宿題だったのか。48が自分で暴露してるし。
いままで謎だったが、読み返してやっとわかった。
最初に53でオレの言った「漢字対応しろ」を、こいつら(54@`57=61=66)はマルチバイト、って取ったわけか。ご苦労様。
あ、それでもオレが変換しろって言ってんだから、別に問題ないか。
変換できない文字をどうするか、の具体的な方法までも一応明記してるしな。(藁
無知をさらけ出してくれたわけだ。(藁
>>72 まあ、ここでどう思われようがかまわないが、基本的に暇つぶしだよ。
83 :
53 :2000/10/29(日) 22:09
この時点でも結局、オレ以外のコードは無しか。(藁
>>78 文句行ってないで、上でオレが出した課題、提出してみれよ?
おまえなら30分以内でできるんだろ?
あと、あそこのconstで文句言ってるって事は、おまえC言語判ってないだろ。(藁
あーあ、面白かった。
もう飽きたから、他の所にでも逝くよ。
バカが移んないうちに出て行くよ。
あとは勝手にやってくれ。
ていうかこんなスレ早く終れ(藁
#関係ないけど、53って良く見たらゴミだ(藁
#我ながら無意識でベストチョイスとは…
>バカが移んないうちに出て行くよ。 誰がバカなんだろう。
85 :
53 :2000/10/29(日) 22:36
>>77 じゃあ、もっとお勉強の仕方を良く考えろって。(藁
>>79 オレがわざわざ58でntabの取りうる値を括弧書きで丁寧に書いてやっただろ。
ちなみにntab & 1は別に無くても動くよ。
厳密に書くなら
if (!cd || !s || !slen || !ntab || ntab & 1)
return 0;
だったな。引数ミスらなきゃどうでも良いことだが。
>>80 このスレの趣旨ってなんだろう…まあいいや。
>>81 >文字列定数使ってくれ
掲示板側で変に変換されるかと思ったんだよ。
やりたきゃ勝手に定数にすれば?
いちいちこの程度のコードに突っ込むなよ。
じゃあな。
>>53 にて、まず文句をつける
>本まるうつし
>漢字対応ぐらいしろよ
>もっと実践的で実になることきぼ〜ん
>>58 にて、自分勝手な方向に話をもっていこうとする
>とりあえずネタ提供します
>コンソール出力や、掲示板にカキコするときにあれば便利なやつ
>>67 にて、あいかわらず趣旨を無視
>確かに文字列処理には興味がある。
>が、このスレのカキコ内容は、全くの無駄としか思えない。
>既に存在するC標準ライブラリの、それも最も低いレベルのルーチン作ってどうする?
>>69 にて、誰も相手にしてくれないので自分で作る
>>82 にて、読んでいない(=普段も仕様を無視)ことを激白。捨て台詞も準備。
>基本的に暇つぶしだよ。
>>83 にて、相手にされていないことにまだ気付かず。
>この時点でも結局、オレ以外のコードは無しか。(藁
>あーあ、面白かった。
>もう飽きたから、他の所にでも逝くよ。
>バカが移んないうちに出て行くよ。
>あとは勝手にやってくれ。
>ていうかこんなスレ早く終れ(藁
捨て台詞をはいた後も、まだまだ暴れる見込み。
>>85 予想通りだった。
>じゃあな。
まだまだ暴れる見込み。
83はバカだな。せいぜい。荒れてくれ。
よかったよ。うつんないうちに出ていってくれたよ。
90 :
53 :2000/10/29(日) 23:24
ばあ。
>>86 =87?
まとめてくれてありがとう。(藁
我ながら名作だな。
91 :
>87 :2000/10/29(日) 23:39
一番興味深い > いちいちこの程度のコードに突っ込むなよ。 が抜けてると思います。
>>91 確かに味わい深いな。
>>74 >ほら、コード書いたから相手にしてくれよ(藁
>>85 >いちいちこの程度のコードに突っ込むなよ。
誰かさんのせいで一気にクズスレッドになりましたなぁ
ほんと。最低だね。
95 :
43 :2000/10/30(月) 01:30
>>42 いや、取りあえず42のコード走らせてみたまえ。
常にbigしか返さないことがわかるはずだから。
要するに、最初のif文が思いっきり間違ってるわけだ。
あのif文を通過できるのは、littleがNULLでなおかつNULL番地に0が入ってる場合だけ。
これは、環境にも依るがアクセスバイオレーションを起こす可能性が高い。
だから0点。期待する結果を絶対に出せない関数は評価に値しないよ。
あと、return *big;もまずいね。
>>43 んー、
あなたには一番言われたくないきがするんですが?
まず添え字([i])使ってる時点で、あー、もう逝ってよし!
あと、「NULL番地に0」ってどういう事?
それと、0点とか言わないでくださいね。
せっかくソース載せたのにこれじゃ42があまりにもかわいそうです。
せめて、ROMと区別するためにも、1点ぐらいあげてください。
っていうか、42も載せる前にテストぐらいした方が良いよ。
勉強にならんだろ?
97 :
43 :2000/10/30(月) 02:24
>>96 >あなたには一番言われたくないきがするんですが?
>まず添え字([i])使ってる時点で、あー、もう逝ってよし!
そいつはすいません。
でも、添え字がダメなのはなんで?iだから?
>あと、「NULL番地に0」ってどういう事?
いや、そんなこと俺に訊かれても。
あのソースからはそう判断するしかないと言うだけの話なんだが。
>それと、0点とか言わないでくださいね。
いや、俺も
>>95 書く前はそう思ったんだけど、あそこまで致命的な
バグがあるコードはやっぱり0点かなと思って。
でも、言い過ぎかもしれないということは一応自覚してます。
ごめん。
>>42 ところで、
>>4 -5のコードは無駄に冗長な気がするんだが。
ホントにあんなコードになってるのか、libc?
>>43 …アハハハ!
なんでこのタイミングで発言する?
なんかえらそうなのに、全く理解していないやつがここに一人。
もしかしてこのスレッドの住人はみんな面白いやつ?
結局、ここにはクズしかいないんだな。
>あのif文を通過できるのは、littleがNULLでなおかつNULL番地に0が入ってる場合だけ。 >これは、環境にも依るがアクセスバイオレーションを起こす可能性が高い。 むふ(笑)正しくは if( (little == 0) || (*little == '\0') ) return big; ですな そういえば文字集合の問題って STL だったか collate 面っていうので解決を試みてなかったかな? (実装レベルはちょっと別にして、そんなのがあったような気がする)
>97 気になるんなら、libcのソース覗いてごらんよ。基本でしょ? つーか、カンニングした時点で、あんた0点ね。(笑)
>95@`>100 0点マニア、うざい。
102 :
通りすがり :2000/10/30(月) 03:04
独自関数の自作ライブラリから転出。デバッ・・ いやよろしければ叩いてください。 遠い昔で覚えていないけどたしか文字列の挿入。 char * strinsert_( char *d@` char *s@` int pos@` size_t siz) { size_t l@` m@` n; if( pos < 0 ) return d; l = strlen(d); m = strlen(s); if( (size_t)pos > l ) pos = l; n = l - pos + 1; if( siz == 0 ) { memmove( &d[pos + m]@` &d[pos]@` n); memmove( &d[pos]@` s@` m); } else { if( (pos + m) < siz ) { if( (l + m + 1) >= siz ) n = siz - pos - m - 1; memmove( &d[pos + m]@` &d[pos]@` n); } else m = siz - pos - 1; if( (size_t)(pos + 1) < siz ) memmove( &d[pos]@` s@` m); d[siz-1] = '\0'; } return d; }
103 :
43 :2000/10/30(月) 03:22
>>98 仕方あるまい、
>>44 の発言したあと、この板見てなかったんだから。
ところで、理解してないって何のこと?
‥‥‥なんて訊くぐらいだから、理解してないとか言われるんだな。鬱だ氏脳。
>>100 別に、カンニングはしてないぞ。
>>44 のコード書いてから、参考にちらっと見てみただけ。
っていうか、
>>4 と
>>44 は似ても似つかないと思うんだが。
104 :
42 :2000/10/30(月) 05:41
>>95 =43
おっしゃるとおり. かなり致命的だった. やっぱテストはするもんですな.
あれでは0点でも仕方ないっす.
いきなり「ぜ〜んぜんだめ. 0点」とかいわれてカチンときてしまった. お恥ずかしい.
どうも NULL の判別の時には ! を間違うな. '\0' は大丈夫なんだけど.
ただ SEGMENTATION VIOLATIOIN は規格上はでないよ. 評価順が決まってるから.
>>96 添え字は別にいいんじゃない? 規格上でも互換性を保証してたような気が.
ポインタと配列と混ぜてあるのがやなの?
# あと 49 でさらに間違って恥の上塗りをしてるのは見過ごしてね. (--;
# 逝ってきます.
42も43もまとめて逝ってよし!
106 :
名無しさん@お腹いっぱい。 :2000/10/30(月) 16:03
あーあ、53のせいでスレが無茶苦茶だよ・・・うぜぇ
あげんな。>65 少なくとも、タブ変換は便利だったけどね。 やっぱ初心者はすぐに使える物作った方がいいかも。 多分、何か完成させて、動かず事が重要なんじゃないの?>初心者
65じゃなくて106ね。 すまそ。
>42 >やっぱテストはするもんですな. こんな事いってるし。
C使うんだったら付属のライブラリ使う 8086で書いてくれんかな
111 :
名無しさん@お腹いっぱい。 :2000/11/05(日) 06:16
つーか、だれかVCのstrrev直してくれよ...
つーか、そんなの使うか? 使うなら自分でかけや。
書いてるさ。 三桁ごとに数字に「@`」いれるだけなのに いちいちstrrev書き直すの馬鹿らしいだろ。 X68K用のlibcあたりでも同じミスあったけど マイナーすぎて誰もなおしてない方に50ペソ
114 :
名無しさん@お腹いっぱい。 :2000/11/05(日) 15:05
>>113 つーか処理系依存の関数使うなよ。ヘルプでもちゃんと頭に「_」が付いてるだろ。
いや、俺も昔知らなくてはまったんだけどさ(笑)
処理系依存でも、どこにでもある関数は、使いたくなるよな。 取捨選択するのも腕だが、 あるものを、いちいち作り直すのはどうかと... 言語の勉強用なら、どんどんやるべきだと思うがね。 このくらい自分で作れという、 ライブラリ作成チームの熱いメッセージなのか?
> ライブラリ作成チームの熱いメッセージ どうでもいいが何かすごくイヤなものを想像してしまった。
>>115 Unix系には無い事が多い。つーかそれではまった。
libcには入ってねえのか。 char *strrev(char *s) { #ifdef MONA register #endif int len@` i; char c; if (s != NULL) { for (len = 0; s[len]; len++) ; for (i = 0; i < len / 2; i++) { c = s[i]; s[i] = s[len - i - 1]; s[len - i - 1] = c; } } return s; } 限定的にしか使えんが、 locale対応めんどくせえから、これで許せ。
119 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 10:45
VCのstrrevって何がバグっているんですか? 自分のプログラムで少し使っているので、教えてください。
>119 教えてもらう前に試せってばよ。 SP4当てても当てなくても同じね。
>111 根性悪いなぁ、お前(笑)
122 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 15:08
>120 もちろん動作確認はしています。実際に使っているのは、_tcsrevですけども。 特定の条件で問題が出るということですよね。 心配なので、どなたか教えていただけませんか?
123 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 15:52
strerrorもきぼ〜ん!
124 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 16:33
char* strerror(char* s) { return "こんな関数に頼らずに自分で調べたらどうですか?"; }
125 :
↑ :2000/11/07(火) 19:42
だから、そういう空虚なバカレスつけるなっての。 教える気ないんなら書かなきゃいいじゃん。 #俺もだが。
>#俺もだが。 余計なこと書くなよ。 オマエモナー。オレモナーができないじゃないか!
>122 _tcsrevは直ってるよ。 MBCS対応すらしてない_strrevだからこそ、 誰も使わず、気づいてないんだろ。 つーわけで、全然効果なし_strrev被害者募集中
>>127 _wcsrevのアルゴリズムは_strrevと全く同じだったが
_tcsrevはMBCSが定義されている場合のみ正しいということ?
おれもどこが悪いのかわからんかった。
テストはしたよ。
129 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 00:06
_strrev試したが、問題見つからず。 引数を NULL 落ちる "" OK "a" OK "aB" OK "aBC" OK "aBcD" OK 300文字のものでもOK デバッガでアセンブリを追ったが、文字列の先頭と最後の2ポインタを用い、 それぞれのポインタが中央で交差するまで移動させながら、 ポインタが示す内容を交換するようになっていた。 上記テストで、異常な結果にならなければ、1バイト長の文字を扱う場合は、 問題は無いはず。
revって何につかうの?
>131 文字列の反転は何処で使うの?
133 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 02:45
ところでさ、すべてのエンコードに対応した str*系作ってみない? そうすればすこしは骨のあるスレになるんじゃないかな。 Javaみたいに内部ストリングタイプをUCS-2かUCS-4であつかえば MCBS 関係の問題は少なくなると思う。 wchar_t はいい加減すぎて、良くないし。
134 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 06:40
簡単に ISO*@`JIS*@`ISO2022-*@`compound text@`sjis@`BIG5--&gt;UTF32 libc for UTF32 UTF32--&gt;ISO*@`JIS*@`ISO2022-*(不完全)@`compound text@`sjis@`BIG5 とか。libc って unicode に対応してるんでしょうか?
初心者プログラマなので間違ったこと言ってたら教えてください。 そろそろ寝ます。
>>133 文字コード系から決めないといけないな
とりあえず案として、
TRONコード+プログラム可能な換算レイヤ+テンプレートレイヤ
な新コード系ってのを出しとく。
テンプレートレイヤには字体互換、名寄せ、異形字体互換程度は必要かな?
>>136 日本語がむちゃくちゃだが、何が言いたいかはわかる
つか欲しいな、そのコード。
138 :
133 :2000/11/09(木) 03:42
マッピング問題や言語の問題はありますが >> ユニコード 言語タグまたは独自のタグを持った UTF32 で処理してしまう TRONはエスケープシーケンスがあるのでちょっと難しそうです。 UTF32に超漢字並のサポートが将来なされることを期待して ということではだめですか?
訂正、一文が抜けていました。 >言語タグまたは独自のタグを持った UTF32 で処理してしまう のはいかがでしょうか?
140 :
名無しさん@優しい人 :2000/11/09(木) 04:10
133-138で言ってたことは所詮、絵に描いた餅だね。 いきなり全ての文字に対応するなんて直ぐに挫折するよ。 テンプレートで実装するにしても、各文字コード毎に特性が異なる筈だから、 かなりの量の例外的な処理を書かなくてはならんだろうし。 修正するたびに不具合が生まれそう。 実際には良く使われる文字コード+αが存在すれば十分では? バイナリエディタとかでは、いろんな文字種が見えたら便利だけど。 俺がこのスレでかなり前に言った様に、1つの文字コードにでも割り切って 効率の良い実装を行い、他のは変換、がお手軽でメンテもしやすいと思うけど、 どうだ? どのみち程度問題だと思うが。
141 :
名無しさん@優しい人 :2000/11/09(木) 04:13
あ、俺はちなみにこのスレの前の方で暴れてた53ね。 直ぐ消えるよ。(藁
142 :
133 :2000/11/09(木) 04:33
>実際には良く使われる文字コード+αが存在すれば十分では? 例えば strrev で文字列を単純に逆列にすると、ほとんどのコーディングは めちゃくちゃになりますよね。シフトコードの ISO2022 はもとより、 シフトコードを持たない SJIS も、専用にコーディングしなければダメです。 そこで、遷移状態のない固定長の UTF を内部コードにしようと 思ったのです。いきなりすべての文字に対応するのは不可能、 というか、UTF 自体が言語の枠を超えて、すべての文字を ひとつの方向にまとめるという思想自体で 包括的にすべての文字へ変換するのは無理です。 とはいえ、UTF になってしまえば、str* がけっこう簡単に なるので、(状態遷移を考えずにすみますから) 私としては「コーディング系→UTF→必要に応じてコーディング系」が 効率的にもいいかな、と思いまして。 将来 UTF が標準のテキストフォーマットになったとして それ以外のコーディングへの変換の犠牲は多大な物になります。 それでも、今のごちゃまぜ状態よりはいいかなと。(^^;)
143 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 04:41
すべての文字に対応するというより、主要なコーディング の間をほどほど使えそうな UTF で相互変換できて、それを str* でまとめて扱えればそれでいいかなと思います。 ちょっと言葉が極端でしたね、反省してます。 相互変換は完全にはできません。出来ない文字は未定義文字に マップされるという仕様です。 (ISO2022-* は指定が必要ですし、UTF から ISO2022-* は むずかしいと試算^^;) だから変換を繰り返すとどんどん 未定義になっていくのかもしれないです。(笑)
希望としては libc for UTF32/UTF16-1 があって 他のコーディングとの相互変換ライブラリがあればいいと思うのですが・・ 誰かお作りになっていないでしょうか。(^^;)
>75 これしきのコードに30分かかるってのもすごいな。 せめて10分くらいで書けるように頑張りなよ。 size_t _2ch_tab2sp(char *cd@` const char *cs@` size_t slen@` size_t ntab) { char *start@` *p; char c; if(!cs || !cd) return 0; start = p = cd; while(slen-- && (c = *cs++)) { if(c == '\t') { if(ntab) { size_t n = ntab - (p - start) % ntab; while(n--) *p++ = ' '; } start = p; } else { *p++ = c; if(c == '\r' || c == '\n') start = p; } } *p = '\0'; return p - cd; } しかし、75のコードと似てしまったのが痛すぎ。
146 :
名無しさん@優しい人=53 :2000/11/09(木) 23:09
>>145 あれから随分経って、なんともイタイ奴が釣れたな(藁
そんなに突っ込まれたいのか?「之甬彳テ人」よ。
久々に笑わせて貰った。
>せめて10分くらいで書けるように頑張りなよ。
オイオイお前、10分ドコロか俺のネタ提供日から「艮旡」に12日も経ってるぞ?
この程度のコードに2週間もかけるな。(藁
>しかし、75のコードと似てしまったのが痛すぎ。
そりゃ、真似すれば「言隹」だって書けるさ。
っていうか、クリソツだな。工夫も何も無い。
小手先だけいじってオリジナリティを語るか?
これは著作権侵害だな。(藁
せめて逆変換の_2ch_sp2tabでも出してれば、少しは評価もしてやったんだが。
全く残念だよ。
ま、痴レスに付き合ってやっただけでもありがたく思えよ。(藁
145ようなたぐいの腕自慢は痛いよな。 「1日五千行くらいは楽勝でしょ?」とかな。
こんなのでオリジナリティとか著作権とか書かれてもなあ。 「ループの中でタブ文字判定」っていう制御の流れは 誰が書いても同じ。strnpyに毛が生えたようなもの。 というか、この程度のコードで「他人には書けない」って 思いこむのは恥ずかしいよ。 (覚えたてで嬉しいのもわかるが) プログラマなら書けない方が異常。
>148 もうちょっとよく読んで考えたら? #なんか結局、53の人のお陰で有意義なスレになりつつありますな。
150 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 04:39
.
151 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 05:09
152 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 05:17
あ、言い訳しに戻ってきた
>>148 >誰が書いても同じ。strnpyに毛が生えたようなもの。
イタイ…
148は通行人?まあ、著作権は著作権だろうね。
154 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 05:44
>優しい人 おまえはもう書くな。 見てるだけで胸くそ悪い。
>>148 こいつは平気で他人の著作物を自分の物と偽り、
ばれたらばれたで、
>誰が書いても同じ。strnpyに毛が生えたようなもの。
こういうセリフを吐くわけだ。
>146=147=152=155=75 関数定義だけコピーしてきて後はすべてオリジナルなんだけどな。 せいぜい頑張って著作権を主張してくれ。 アホに火をつけてしまったようで、ごめん >他のみんな ここまで精神年齢が低いとは思わなかったので。 もう相手にしないことにするよ。
>>145 を30分だ10分だっていってる程度のくせに
>>157 みたいな
ことが書ける精神力がうらやましい…
>>145 何を今更
>>148 煽りにマジレスするだけ無駄だぜ
特に今回に関しては145が間抜け過ぎる
>>149 有意義なスレって....
お前こそ良く読んでみろ
>>150 ed使い?
>>153 トートロジーを騙って楽しいか?
>>155 お前は優しい人の煽りを鵜呑みにして
おまけに別人に対してイチャモンを付けるわけだ。
「他人の著作物」とか言う前にdiffぐらい取ってみろよ
>>157 お前ほんとは「優しい人」と遊びたかったのか?(ヤレヤレ)
書かれたコードから客観的に判定すると、69より145の方が能力が上。 それがわからずに真似だとかほざいてる「優しい人」はかなりイタい。
スレ立てた者です。 途中でイヤになって書き込みしませんでしたが、相変わらず 荒れてますねー、ここ(苦笑) 私も160さんと同意見です。 69を書いた人に真面目に忠告しときますが、自分の未熟を 自覚できない人は、今以上のスキルアップはできませんよ。 もっと謙虚になった方がいいのでは?
162 :
名無しさん@優しい人 :2000/11/10(金) 23:32
なんだ、あれだけ書いただけで随分批判者が出てきたな。(藁 あんな事で躍起になってる奴全員イタイ
163 :
名無しさん@優しい人 :2000/11/10(金) 23:36
>>154 ここではオレはこういうスタイルなの!
つうわけでまたね。(藁
スキルアップしなさそうだな…
一番躍起になってるのはおまえだろ>162
「名無しさん@優しい人」の母でございます。 このたびは、息子がこのようなレスを返してしまい、 皆様には大変ご迷惑をおかけしております。深くお詫び申し上げます。 息子は幼い頃に父親を亡くし、そのショックで内気な子供になって しまいました。そのせいか、小・中学校ではいじめにあっていたのです。 この年になるまで、恋人はおろか友達さえもいないようで、大変心配 いておりましたが、この2ちゃんねるというサイトを知って以来、息子も 少し明るくなったようです。「今日○○板でね、ドキュソがさあ…」 と、とても楽しそうに夕食の時に話してくれるのです。 どうぞ皆様、息子を暖かく迎えてやってくださいまし。本当は良い子なんです。 よろしくお願い申し上げます。
167 :
名無しさん@優しい人 :2000/11/12(日) 23:38
>>166 おいおい、隠れて人の悪口言う奴は最低の人間だぞ?
ネタならちゃんと上げて書込めよ、見逃す所だったよ。(藁
168 :
名無しさん@優しい人 :2000/11/12(日) 23:43
>>160 違う方法を思い付きもしなかった奴が、
能力どうこうのレベルかぁ?(藁
169 :
名無しさん@優しい人 :2000/11/12(日) 23:49
それにしても、 いまいち名無しさんに煽られても面白味が無いな。 そろそろマジで飽きてきたよ。
上の方をよまないと、まけおしみにしか見えんなぁ
171 :
名無しさん@優しい人 :2000/11/13(月) 00:48
>>170 >上の方をよまないと、まけおしみにしか見えんなぁ
166を書いたやつか?
意味がよくわかんなかったよ。
それでどうしたいんだ。上 (って166か?) の話は続くのか?
あ、答えなくていいよ。
あんたの話すことに興味は無いからな。
なんかすごい高圧的なやつがいるな
上のほう読んでも、負け惜しみにしかみえねーよ(藁
あ、遠吠えしに戻ってきた。 可愛そうに。よっぽどプライドを傷つけられたんだねえ。 今まで「自分より低レベル」だと思っていた連中に。
str[n]cpyはそりゃ君LDIR使えば一発だろ
>あんたの話すことに興味は無いからな。 俺もあんたの話すことにはキョーミないなあ。 低レベルでウソばっかなんだもん。