トップページ⇒tech
909コメント312KB

C言語なら、俺に聞け! <9>

■ このスレッドは過去ログ倉庫に格納されています
0001C言語ハッカー Kusakabe YouichiNGNG
おれは21才、9年間プログラムを一生懸命作ってきた。
あちこちの言語に手を出したが結局極めたのはC言語だけだった。
大体のことなら分かるからオレに聞け。

だが、いちいちFAQに載った質問に応えるほど暇じゃない。
課題丸投げなら別スレにいけ。

・comp.lang.c Frequently Asked Questions
http://www.eskimo.com/~scs/C-faq/top.html

・C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html

・前スレ C言語なら、オレに聞け! <8>
http://pc.2ch.net/test/read.cgi/tech/1005811510/l50
0577デフォルトの名無しさんNGNG
>>574
コンパイルする環境ないの?
そのコードは動いてないよ。
0578デフォルトの名無しさんNGNG
>>574
何も間違ってないぞ。
その解釈であってる。
0579デフォルトの名無しさんNGNG
>>574
101000 (x)
100111 (x-1)
100000 (x & (x-1))
0580571NGNG
>>576
ありがとうございます。
0581デフォルトの名無しさんNGNG
>>575
http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/index.html
リンク先の項番71から読め
0582デフォルトの名無しさんNGNG
srtcmpを使って数字を比較しようとしているのですが、
これだと2つの値が同じときでも後者が大きいと判断
されてしまいました。
ちゃんと等しいときに0を返してくれるのってどうすれば
いいのでしょう?

#include<stdio.h>
#include<string.h>

int main(){
char a[2],b=0;
a[1]=10;
a[2]=10;
b=strcmp(&a[1], &a[2]);
printf("a[1]: %d a[2]: %d b=%d\n",a[1],a[2],b);
if(strcmp(&a[1], &a[2])==0)
printf("等しい\n");
else if(strcmp(&a[1], &a[2])>0)
printf("a[1]が大きい\n");
else
printf("a[2]が大きい\n");
}
0583571NGNG
>>581
ありがとうございます。
読んでみましたがよくわからないです。。。

C言語及びプログラム言語初心者には
難しい課題を与えられた気がします。。。
もっと簡単にできないでしょうか?
0584デフォルトの名無しさんNGNG
>>582
> srtcmpを使って数字を比較しようとしているのですが、
そもそもstrcmpは数字を比較するものではない。

> ちゃんと等しいときに0を返してくれるのってどうすれば
> いいのでしょう?
「ちゃんと等しい」をもっと「ちゃんと」定義して欲しい。

とりあえず
> if(strcmp(&a[1], &a[2])==0)
if(a[1] - a[2])
では駄目なのか?
0585デフォルトの名無しさんNGNG
>>582
>srtcmpを使って数字を比較しようとしているのですが、
もうね、アホかと。馬鹿かと。
0586デフォルトの名無しさんNGNG
あのさぁ、だめだめ!
割り算ってどーやるの?あれ?
まずふつーにやるだろ?余りがでんだろ?
その次どーすんの?0くっつけんだろ?それってなに?10倍ジャン?
そーやってやると小数圏に突入(乳突起きぼんぬ)すんだろ、
そんでつづけていけば最高じゃんか

そーやってやれ。余裕だ。
0587デフォルトの名無しさんNGNG
>>584
> そもそもstrcmpは数字を比較するものではない。
ごもっともです。
でも、a[1],a[2]を文字に置き換えてもstrcmpの結果が
0にはなってくれません。

とりあえずif(a[1]-a[2])でもできないこともなさそうです。
ありがとうっす。
0588デフォルトの名無しさんNGNG
>>582
すごい妄想だな!
strcmpは同じだとTRUE=1を返すんだっけ?そこが逆?
あと、数字の大きさ比較するにはなにも、引き算でいいじゃんか
0589デフォルトの名無しさんNGNG
引き算したかったらatoiを使えYO
たとえば文字(列)"4"を数字でつかえる4にしてくれるZO
0590デフォルトの名無しさんNGNG
ちなみにAPI板にも寄ってください・・・
0591デフォルトの名無しさんNGNG
そこまでたたかなくてもいいじゃん(^-^;
0592デフォルトの名無しさんNGNG
宿題レスにもな。
0593デフォルトの名無しさんNGNG
>>574
for (b=0; x != 0; x&=(x-1), b++)
にしないと、x=1のときゼロになる
0594デフォルトの名無しさんNGNG
>>587
> でも、a[1],a[2]を文字に置き換えてもstrcmpの結果が
> 0にはなってくれません。
残念ながらstrcmpは「文字」を比較するものでもありません。
「文字列」を比較します。

「文字」と「文字列」の違いについては入門書を良く読んでください。
0595デフォルトの名無しさん NGNG
とりあえず添え字は0からだよ、a[2]は書いてはいけない領域
0596デフォルトの名無しさんNGNG
つーか複雑なこといわなくても、
文字を比較したかったら=使えばいいじゃんか
strcmpは文字も比較できるぞ。
=使ってて例えばabcdefghi(\0)からbcdなりcなりを
抽出したいときはどーする?そーゆーときstrcmpとか
シリーズを使うのだ!
0597デフォルトの名無しさんNGNG
>>596
> strcmpは文字も比較できるぞ。
できません。
できると思う人はできる例を示してください。

char a = 'a';
char b = 'a';
これをstrcmpでどう比較するの?
0598デフォルトの名無しさんNGNG
>>597
strncmpを使えばできるね。
strcmp(&a,&b)でも比較対象a,bのそれぞれのすぐ後ろが'\0'なら
できないと言えなくも無いね。

だけど、そんなコードを俺の目の前で書いたら、氏なす。
0599デフォルトの名無しさんNGNG
>>598

それはたまたま'\0'があったらってことだよね?
多くの場合において無いと思うから、同じ文字だったらアクセス違反になるだろうね。

ところで、なんで比較演算子を使いたがらないんだろう?
数字が昇順に並んでいない文字コードがあるの?
もしあったとしても、atoi()で変換してやればいいじゃない。
0600599NGNG
あ、昇順に並んでいなかったらstrcmpもstrncmpも使えないか・・・・
0601Kusakabe YouichiNGNG
In article >>599, デフォルトの名無しさん/599 wrote:
> ところで、なんで比較演算子を使いたがらないんだろう?
> 数字が昇順に並んでいない文字コードがあるの?

けっこうありますね > そういうコードセット
0602Kusakabe YouichiNGNG
In article >>600, 599/600 wrote:

> あ、昇順に並んでいなかったらstrcmpもstrncmpも使えないか・・・・

え、それとは独立な問題ですよ。
0603デフォルトの名無しさんNGNG
>>597
馬鹿言うな
文字比較したいときは人間の手で一文字の
配列をつくるんですYO。
たとえば文字(列)検索ルーチンで
わざわざ一文字と複数文字の区別するんですか?
(ちょっとはするけどさ)基本的に文字列としてあつかうでしょ?
0604Kusakabe YouichiNGNG
In article >>603, デフォルトの名無しさん/603 wrote:
> たとえば文字(列)検索ルーチンで

どっちですか? > 文字/文字列
0605デフォルトの名無しさん NGNG
糞壁が痛い人を呼んでいるので終了。
Cに於いて文字列とはヌルターミネートされた文字の並びを指します(例え一文字でも)
strcmpは文字列を対象に書かれてますので、文字の照合は///出来ません///
0606デフォルトの名無しさんNGNG
>>strcmp(&a,&b)でも比較対象a,bのそれぞれのすぐ後ろが'\0'なら
>>できないと言えなくも無いね。
この辺りから糞壁信者っぽい、ネタにもならんね
0607デフォルトの名無しさんNGNG
大体文字と文字列の区別なんて意味がわかっちまえば
こだわる必要ねーんだよ。意味がわかったら
人間語の文字つー意味にもどれよ。
要は終記号がないとコンピューターが判断できない
つー話でしょうが。

テキスト中の文字(列)検索したいときに
いちいち一文字と複数文字の区別考えて
「えーっと、いま検索窓にaっていれたから
今は文字検索したな」やれ「あ、”あいう”っていれたから
これから文字列検索をします!」とか下らんことかんがえる
わけですか?語句検索すんのに文字も文字列もきにしないんですけど。
0608デフォルトの名無しさんNGNG
じゃぁ文字照合したいときはどーすんの?
できないじゃん。
どーせちょちょっとやって、strcmp使ったって
いいんじゃんか。おんなじことだぜ?ほかの方法つかったって。
0609Kusakabe YouichiNGNG
In article >>605, デフォルトの名無しさん/605 wrote:
> 糞壁が痛い人を呼んでいるので終了。

わたしのせいにしようとしても無駄ですよ:)
呼んでいるのはあたなでしょう:)

> Cに於いて文字列とはヌルターミネートされた文字の並びを指します(例え一文字でも)

なんじゃそりゃ:) > 例え
0610Kusakabe YouichiNGNG
In article >>607, デフォルトの名無しさん/607 wrote:
> テキスト中の文字(列)検索したいときに

で、どっち? :) > 文字/文字列
0611デフォルトの名無しさんNGNG
以下605の戻って無限ループ
===終了===
0612デフォルトの名無しさんNGNG
(・∀・) デンパイタデヤッテロ!!
0613デフォルトの名無しさんNGNG
うぉ!まだ言ってるんのか!
僕はヤフー検索するのに文字か文字列
なんて考えません。語句です。語ですか?句ですか?
とかいっちゃうあなたにマイナス1点
だいたいあなた、間違ってるYO.
文字列or文字、それでWholeをカバーするんですか?
絶対にどっちかだ!とか考えてんでしょ?
文字列を文字の区別はYes or Noとは違いますよ?
僕は人間言葉の文字という意味を使った。
0614574NGNG
有り難うございました。
考え出したら、ぐるぐる巡ってしまって、ちょっと解んなくなってました。
コードは、')'が足りなかったですね。
有り難うございます。

では、また、頑張ってみます。
0615デフォルトの名無しさんNGNG
ここで糞壁を煽るのは良いけど、技術的な突っ込み所満載な悲惨さまでは
再現しなくていいよ (^^;
0616Kusakabe YouichiNGNG
In article >>613, デフォルトの名無しさん/613 wrote:

> うぉ!まだ言ってるんのか!
> 僕はヤフー検索するのに文字か文字列なんて考えません。

っていうかどっちですか?

1文字の文字と、
1文字の文字列は別物ですよ。
0617デフォルトの名無しさんNGNG
いやマジで他所でやって頂きたい
>>613
>僕は人間言葉の文字という意味を使った。
人間言葉の文字って何? 検索しても出てきませんが?
0618デフォルトの名無しさんNGNG
サイコロをA回振ります。
1〜6のそれぞれの目が出た回数を記録していきます。
振り終わった時に考えられる結果(1がm回、2がn回、3が…)
の総数と、一番多く出た目の数と一番少なく出た目の数の
差がB以下になる確率を出します。
Aを入力してからBを入力すると計算が始まります。
不正な数字が入力された時のチェックなどは省いています。
と、いうプログラムを気合で作りました。C初心者です。

添削希望です。
もっといい書き方などありましたら教えていただきたいです。
2回に分けてコピペします。
0619618NGNG
#include<stdio.h>
#include<conio.h>

void count(int *a,int margin,int *total,int *hit);
void haji(int *a,int *b);
void indec(int *a,int *b);

int zzz=0;

int main(void)
{
int eye[6]={0,0,0,0,0,0},margin,shake;
unsigned long int total=0,hit=0;
char ex;

printf("振る回数 … ");
scanf("%d",&shake);
printf("差 … ");
scanf("%d",&margin);

eye[0] = shake;

while(eye[5] != shake){



if(eye[5])haji(eye,eye+5);
else if(eye[4])indec(&eye[4],&eye[5]);
else if(eye[3])indec(&eye[3],&eye[4]);
else if(eye[2])indec(&eye[2],&eye[3]);
else if(eye[1])indec(&eye[1],&eye[2]);
else indec(&eye[0],&eye[1]);

count(eye,margin,&total,&hit);


}
count(eye,margin,&total,&hit);

printf("\n\n振る回数:%d回 差:%d以下\n",shake,margin);
printf("パターン数:%ld ヒット数:%ld ヒット率:%.15lf%\n\n",total,hit,(double)hit/(double)total*100);
printf("何かキーを押すと終了します。");

ex=getche();

if(shake>70){
printf("\n!!再確認!! 何かキーを押すと終了します。");
ex=getche();
}

return 0;

}
0620デフォルトの名無しさんNGNG
>615 寧ろ技術的な裏付けの無い発言を書き捨てる時の共有コテハン (w
つーか下げでやれ下げで
0621618NGNG
void indec(int *a,int *b)
{
(*a)--;
(*b)++;
}
void haji(int *a,int *b)
{
int i,kou=*b;

if(zzz < *b){
zzz = *b;
printf("%3d ",*b);
}
*b = 0;

for(i=4;;i--){
if(*(a+i)){
*(a+i+1) = kou;
(*(a+i+1))++;
(*(a+i))--;
break;
}
}

}
void count(int *a,int margin,int *total,int *hit)
{
int i,high,low;

high = *a;
low = *a;

for(i=0;i<6;i++){
if(high < *(a+i))high = *(a+i);
}

for(i=0;i<6;i++){
if(low > *(a+i))low = *(a+i);
}

if(high - low <= margin)(*hit)++;

(*total)++;
}


以上です。よろしくおねがいします。
0622デフォルトの名無しさんNGNG
eyeは無いでしょ(^-^;
0623あぼーんNGNG
あぼーん
0624618NGNG
>>622
あの、では、eofdieですか?英語弱くて…
あと、コメント無くてスイマセン。
0625デフォルトの名無しさんNGNG
>>608
> じゃぁ文字照合したいときはどーすんの?
strchr
ちなみに文字列照合の場合はstrstrを使う。

>>616も言っているが
「文字」と「文字列長が1の文字列」は別物

入門書から読み直せ
0626Kusakabe YouichiNGNG
In article >>625, デフォルトの名無しさん/625 wrote:
> 入門書から読み直せ

どんな入門書がよいでしょう?
0627デフォルトの名無しさんNGNG
「作ってわかるCプログラミング」を万引き
0628デフォルトの名無しさんNGNG
「ツクッテワカル Cプログラミング」ニ キマッテルダロ
0629デフォルトの名無しさんNGNG
作ってわかるCプログラミング、紙質が素晴らしいね
紙面の余白がとても多いのも良い、メモ帳にぴったりですね
次からはミシン目を入れて下さい :-D
0630Kusakabe YouichiNGNG
In article >>629, デフォルトの名無しさん/629 wrote:

> 作ってわかるCプログラミング、紙質が素晴らしいね

はい、ペイジ数がとても多いのに、厚さを増さないように、
高い紙を使ったそうです。

> 紙面の余白がとても多いのも良い、メモ帳にぴったりですね

え? 余白は「少ない」ですよ。わたしはもっと余白をとってほしかった
(とくに小口側じゃなくてノドの側、ぎっしりすぎて読みにくい)

「余白が多い」とかって、ようするに実物見てないのでは? :)
(ここで誰かが書いてたデマを信じて書いたんだったら、恥かくだけですよ^^)
0631デフォルトの名無しさんNGNG
>>627-629
ここでやるなよ。
隔離板へ逝け。
0632デフォルトの名無しさんNGNG
>>626
C言語入門書
http://www.amy.hi-ho.ne.jp/~lepton/program/prog/prog78.html

によると
> 「悪い入門書」のチェックポイント
> ・著者のイニシャルがK(あ、あとついでにMも)である :-p
だそうです。
# 例えばK下部とかかな?
0633574NGNG
593さん、有り難うございます。
あの辺りのスレ読み飛ばしていました。
0634デフォルトの名無しさんNGNG
オライリーのC実践でいいんじゃないの?
0635デフォルトの名無しさんNGNG
>>632

http://www.amy.hi-ho.ne.jp/~lepton/program/mail/19990628.html
78の K西本批判は、その通りだと思います。
0636デフォルトの名無しさんNGNG
だから俺は明示的にC言語の「文字」
の意味だ、と言った覚えがないのだが
0637デフォルトの名無しさんNGNG
分かった分かった「人間言葉の文字」だよな (w
0638デフォルトの名無しさんNGNG
>>636
ここは C 言語スレです。一般的な「文字」について語りたいなら、別のスレでお願いします。
(そもそも「俺」って誰だよ、番号書いてくれないと名無しさんばっかで分からん)
0639exciteさんに訊いてみましたNGNG
人間言葉の文字
↓
The character of human language
↓
人間の言語の特徴
0640デフォルトの名無しさんNGNG
だったら君はテキスト内を検索
するときにせいぜいアスキーコードでも
使って配列でもつくるんだねw
0641Kusakabe YouichiNGNG
In article >>636, デフォルトの名無しさん/636 wrote:

> だから俺は明示的にC言語の「文字」

明示的っていう日本語はないですね。
0642デフォルトの名無しさん NGNG
どっけ池、糞壁!(・∀・ )♪
0643仕様書無しさんNGNG
上京を「京都に行くこと」と訳す人間に、
日本語語って欲しくないです。
0644デフォルトの名無しさんNGNG
上京ってのは、みやこへ行くことだろ。
京都の人間にとっちゃ、みやこは今でも京都だし、
それを聞いた東京の人間は、とっくに遷都しただろと思う。
0645デフォルトの名無しさんNGNG
スレ違いかつ板違い。
0646デフォルトの名無しさんNGNG
>>643
誤植です。
0647Kusakabe YouichiNGNG
In article >>643, 仕様書無しさん/643 wrote:

> 上京を(I☆ぢ京都に行くこと(I�C般�C洪祐屬法「

何言ってるんだかわからないですね。
0648デフォルトの名無しさんNGNG
それはCとは関係あるの? 関係ないならsageでね。
0649デフォルトの名無しさんNGNG
>>648
> それはCとは関係あるの? 関係ないならsageでね。
sageていれば関係無いことをいくら書き込んでもいいということですか?
0650デフォルトの名無しさんNGNG
なんでKusakabeの引用は化けるの?
0651Kusakabe YouichiNGNG
In article >>650, デフォルトの名無しさん/650 wrote:

> なんでKusakabeの引用は化けるの?

わたしのが化けているのではなくて、もとのがいけないだけでは?
0652デフォルトの名無しさんNGNG
kusakabeが悪いよ。
0653Kusakabe YouichiNGNG
In article >>652, デフォルトの名無しさん/652 wrote:

> kusakabeが悪いよ。

いいえ。
0654デフォルトの名無しさんNGNG
どうせKusakabeが変なソフト使ってるんでしょ。
0655デフォルトの名無しさんNGNG
voidタン・・・ハァハァ
0656Kusakabe YouichiNGNG
In article >>654, デフォルトの名無しさん/654 wrote:

> どうせKusakabeが変なソフト使ってるんでしょ。

私のは問題ないですね。
0657デフォルトの名無しさんNGNG
>>656
JIS X 0201仮名が化けたり、JIS X 0208の英数字をISO 8859-1に変換したり
するのは、少なくとも2chの閲覧に限っては問題あると思います。
閲覧するだけならどうでもいい話ですが、引用時にそれを行うのは著作者人格権の
同一性保持権を侵害していることになります。
0658Kusakabe YouichiNGNG
In article >>657, デフォルトの名無しさん/657 wrote:
> JIS X 0201仮名が化けたり、JIS X 0208の英数字をISO 8859-1に変換したり

はつみみです。
0659デフォルトの名無しさんNGNG
やあみんな!元気?

strcmpで文字列でなく (見た目上)文字を比較する方法を編み出したよ!
やり方は簡単さ!

int a = 'a';
int b = 'b';

if( strcmp(&a,&b) )printf("chigau\n");

ほら、これなら 文字を比較 してるように見えるだりろぉ?

あー石投げるな〜機種依存〜
0660デフォルトの名無しさんNGNG
>>619
変数名、引数名が適当すぎる。
それじゃ添削以前に、やってることが理解できないから
読む気がしない。

もっと意味のある変数名にするか、コメントで説明をつけてくれ。
変数名がちゃんとしていれば、コメントは最小限で済む。
0661デフォルトの名無しさんNGNG
つまらない。
if ( a < b ) kill(>>659);
0662Kusakabe YouichiNGNG
In article >>661, デフォルトの名無しさん/661 wrote:

> つまらない。
> if ( a < b ) kill(>>659);

2項演算子ですね。
0663デフォルトの名無しさんNGNG
下位7ビットでasciiをサブセットに持っていない文字コードは何があるの?
0664Kusakabe YouichiNGNG
In article >>663, デフォルトの名無しさん/663 wrote:

> 下位7ビットでasciiをサブセットに持っていない文字コードは何があるの?

いくらでもあるとおもうが。
0665デフォルトの名無しさんNGNG
>>661
つまらない、って一刀両断することも無いだろ。

どうして特定の環境で>>659のコードが正しく動いてしまうのか
ということを考えてみた方が面白くはないか?

少なくとも俺が昔このコードを読ん
0666デフォルトの名無しさんNGNG
>664
具体的に教えて。
そしてその文字コードを使うOSも教えろゴラア。
0667デフォルトの名無しさんNGNG
>>665
読ん?続きないの?
0668デフォルトの名無しさんNGNG
>>665
> 少なくとも俺が昔このコードを読んだときには一目で動く理由がわかったぞ
0669デフォルトの名無しさんNGNG
>>668
> 少なくとも俺が昔このコードを読んだら一目で恋に落ちたぞ
0670デフォルトの名無しさんNGNG
ゴルゴの標的にされた模様。>>665
0671デフォルトの名無しさんNGNG
過去ログdat待ちでこのスレしかみてないんですけどなかったから質問です。

RS232Cシリアルポートの送受信ってどするのでしょう?
0672デフォルトの名無しさんNGNG
osの上ならポート指定してwrite、readするだけ。
0673デフォルトの名無しさんNGNG
>>671
I/Oポートに直接ガンガン書けばいいんじゃない?
0674デフォルトの名無しさんNGNG
あと受信はタイマかスレッドで定期的にしろ。
0675デフォルトの名無しさんNGNG
>>674
割り込みつかうのは邪道?
0676デフォルトの名無しさんNGNG
使える環境ならそれを使う。
だいたいOSの上からは割り込みなんて使えんだろ。
■ このスレッドは過去ログ倉庫に格納されています