C言語なら俺に聞け( ..
[2ch|▼Menu]
83:デフォルトの名無しさん
08/02/21 22:48:12
途中で送信してもうた...

>>82 のとき文字列としては等価と判定せねばなるまい

84:デフォルトの名無しさん
08/02/21 23:40:51
memcmp(han1,han2,strlen(han1))の場合
han1が多い時とhan2が多いときで誤差でない?

85:76
08/02/21 23:44:50
>>80
訂正
memcmp(han1,han2,strlen(han1)+1)

86:84
08/02/22 00:27:26
han1が10文字
han2が20文字

han1が20文字
han2が10文字

の時にmemcmpだとゴミが入ってしまって無理じゃないかね?ってことね

87:デフォルトの名無しさん
08/02/22 00:29:37
違いを検出するだけでいいなら、memcmp()でも問題ないね。

88:ててて
08/02/22 09:57:29
han1 = fgets(temp1,81,Fp1);
han2 = fgets(temp2,81,Fp2);
と、なっているところでテキストファイル同士比べる時に、
han1 = [aaaaaaaaaa]
han2 = [aaaaaaaa]
などなっていても実際80文字分(1行分?)までの区切りなので初期化する必要ってありますか?
一応比較して結果が0なら比較内容同じ、-1か1なら違うとでるようにするだけなのでfgetの文字数と同じなら大丈夫な気がするような・・・


89:デフォルトの名無しさん
08/02/22 10:00:40
短いほうが\0で終わってるわけだから
そこまでが同じならば短いほうが小さい、という結果になる
なのでどっちの長さを指定してもいいが、\0まで含めることが必要。
\0を超えての比較は意味が無いので、バッファのサイズで比較するのは間違い。

90:ててて
08/02/22 10:52:10
なるほど〜

それじゃあ、そろそろ答え81って書いて提出します
みなさんのおかげでいろいろわかりました
どうもありがとうございました

91:デフォルトの名無しさん
08/02/22 11:26:14
>>90
han1[]="abcd\0e";
han2[]="abcd\0f";

92:ててて
08/02/22 12:21:24
>>91
の場の場合もあるにはありますよね
そこら辺の指定はまったくないんですよね

問題文
以下のプログラムは起動時に指定された2つのテキストファイルを比較し、
違う行があればその行番号を表示するプログラムです。
空白部分を埋めて、プログラムを完成させなさい。
という文章で自分で strcmp のバージョンは穴埋めはできたと思います

問題2
問題1のプログラムにおいてstrcmpを使用して読み込んだ2つのレコードが同じかどうか判断しています
これをmemcmpを利用したロジックに作り直しなさい

それで比較する部分のstrcmpをmemcmpに変えて書いたんですが読み込みするテキストファイルの指定は全くありません
それで文字列分指定すればいいかなーと思っていたんですが・・・

>>90のようにそこまで深く考えたほうがいいのでしょうか?
意地悪問題すぎる

93:デフォルトの名無しさん
08/02/22 12:24:05
だから単に片方のをstrlen()+1すればいい
strlenも使用不可なのかな?でも自作するくらいならmemcmpも使わんしなw

94:ててて
08/02/22 13:40:00
>>93
strlenは使えます

と言うか勘違いしてましたw
それで当たってますね

han1 = aaa\0
han2 = aaab\0
memcmp = (han1,han2,strlen(han+1))
だと返す変数0になりません?
と勘違い

文字数で違うなら\0の部分で0以外返しますし
文字が違うならやっぱり0以外返しますね

答えにそうかいて出します
ちゃんと理解して解決しました
本当にありがとうございます

95:デフォルトの名無しさん
08/02/23 01:47:49
大きい二次元配列の初期化ってどうやればいいんですか?

char buf2[20][20];char buf[256];
double dat[10000];

とかだったら。

96:デフォルトの名無しさん
08/02/23 02:06:36
>>95
ループで各要素に初期値を代入する。
2次元配列の場合は2重ループで初期値を代入する。

char buf[256];が文字列だったら、strcpy(buf, "");

97:デフォルトの名無しさん
08/02/23 02:09:13
その前に、本当に初期化する必要があるかどうかチェックしてね。
無駄に初期化する人が多いから。

98:デフォルトの名無しさん
08/02/23 02:15:11
>>96
それってstrcpy使う必要あるのか?

99:デフォルトの名無しさん
08/02/23 02:22:59
初期化することって規約があることもあるんだぜ・・・。

100:デフォルトの名無しさん
08/02/23 02:25:44
初期化する必要ない場合ってどういう場合?

LINUXでいいデバッガない?

101:デフォルトの名無しさん
08/02/23 02:26:19
初期化する必要ない場合は初期化する必要ない場合

102:96
08/02/23 02:26:53
>>98
ヌル文字での初期化の場合ね。
buf[0] = '\0'
でもいいんだが、好みの問題。

103:デフォルトの名無しさん
08/02/23 02:29:08
double data[10000]={0}だと初期化できてないみたいなエラーでるけどこれは
範囲あるの?

104:デフォルトの名無しさん
08/02/23 02:29:32
>>102
最適化すればオーバーヘッドなくなるのかな?
まぁもともと無視できるほどの差だろうけど

105:デフォルトの名無しさん
08/02/23 02:30:57
>>103
規格では全て 0 で初期化されるはずだが。
警告出すコンパイラならあるけど。

ただ、コンパイラが糞だと知らん。

106:デフォルトの名無しさん
08/02/23 02:34:47
セミコロンがないとかじゃないよな

107:デフォルトの名無しさん
08/02/23 03:15:36
URLリンク(www.shinetworks.net)

この、12行目〜16行目までの解説をお願い致します。
特に解らないのが、12行目の" if(argc > 1) { "の部分です。
配列argcが1より大きければ、と言う言でしょうか?

108:デフォルトの名無しさん
08/02/23 03:19:31
コボラーさんがC言語覚えるのは結構大変?


109:デフォルトの名無しさん
08/02/23 03:19:36
文字列の長さも確認せずに strcpy はやばいだろ。

110:デフォルトの名無しさん
08/02/23 03:20:38
大変? とか気にしてる時点で脈は無いわ。

111:デフォルトの名無しさん
08/02/23 03:28:52
>>107
argcはコマンド引数の数+1。

コマンド行がhogeのときargcは1。
コマンド行がhoge arg1のときargcは2。

だからif(argc > 1)とはコマンド引数がひとつ以上あるということ。


112:デフォルトの名無しさん
08/02/23 04:27:04
>>111
サンクスです

113:デフォルトの名無しさん
08/02/23 04:28:35
>>111
>>だからif(argc > 1)とはコマンド引数がひとつ以上あるということ。
ないときは、あるんですかね?

114:デフォルトの名無しさん
08/02/23 04:31:58
ないときはないよ。そんときは、argcが1になる。

115:デフォルトの名無しさん
08/02/23 04:41:37
>だからif(argc > 1)とはコマンド引数がひとつ以上あるということ。
いや,2つ以上だろ.もしくは1つよりも多く.

116:デフォルトの名無しさん
08/02/23 04:42:24
argc==2なら引数は1だろ。

117:デフォルトの名無しさん
08/02/23 05:09:25
?                  ↓-此れは?
006: int main(int argc,char *argv[]


>>113
ああああああぁぁあぁ…   永遠に繋げていく事か"!

if( argc > 1, argv > 1, argc > 1) = argc[1]


118:デフォルトの名無しさん
08/02/23 06:45:19
頭が混乱してきた…整理ついたら、出直してきます 
ありがとうございました


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5395日前に更新/26 KB
担当:undef