- 1 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 23:11:47 ]
- C言語の入門者向け解説スレです。
・C++言語はスレ違いです。 ・分からない事をなるべく詳しく書いて下さい。 ・ソースコードを晒すと答えやすくなるかもしれません。 ・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。 前スレ C言語なら俺に聞け(入門篇) Part 24 pc11.2ch.net/test/read.cgi/tech/1201083176/ 教えて欲しいのではなく丸投げしたいならこちらへ C/C++の宿題を片付けます 104代目 pc11.2ch.net/test/read.cgi/tech/1202135539/
- 76 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:29:08 ]
- >>75
memcmp(han1,han2,strlen(han1))
- 77 名前:デフォルトの名無しさん [2008/02/21(木) 22:33:13 ]
- #include <stdio.h>
int main(void) { char str[80]; int i, spaces; char *p; printf("文字列を入力してください: "); gets(str); spaces = 0; p = str; while(*p){ if(*p==' ') spaces++; p++; /* このポインタのインクリメントは"*p++;"としても プログラムは正しく動作します。なぜですか?*/ } printf("スペースの数: %d", spaces); return 0; } すいません。教えてください。
- 78 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:38:43 ]
- * よりも ++ の方が演算の優先順位が上だから。
*p++ってのは*(p++)と等しい。
- 79 名前:77 [2008/02/21(木) 22:40:33 ]
- >>78
すばやい回答、ありがとうございました。m(_ _)m
- 80 名前:ててて mailto:sage [2008/02/21(木) 22:41:18 ]
- >>76
なんという そうかーなるほど・・・ うう、ひらめきって大事ですね
- 81 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:45:01 ]
- char temp1[81] = {'\0'};
- 82 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:46:58 ]
- >>81
temp1[81] == "abcde\0\0"; temp2[81] == "abcde\0f"; このとき文字列としては
- 83 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:48:12 ]
- 途中で送信してもうた...
>>82 のとき文字列としては等価と判定せねばなるまい
- 84 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:40:51 ]
- memcmp(han1,han2,strlen(han1))の場合
han1が多い時とhan2が多いときで誤差でない?
- 85 名前:76 mailto:sage [2008/02/21(木) 23:44:50 ]
- >>80
訂正 memcmp(han1,han2,strlen(han1)+1)
- 86 名前:84 mailto:sage [2008/02/22(金) 00:27:26 ]
- han1が10文字
han2が20文字 han1が20文字 han2が10文字 の時にmemcmpだとゴミが入ってしまって無理じゃないかね?ってことね
- 87 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:29:37 ]
- 違いを検出するだけでいいなら、memcmp()でも問題ないね。
- 88 名前:ててて mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:00:40 ]
- 短いほうが\0で終わってるわけだから
そこまでが同じならば短いほうが小さい、という結果になる なのでどっちの長さを指定してもいいが、\0まで含めることが必要。 \0を超えての比較は意味が無いので、バッファのサイズで比較するのは間違い。
- 90 名前:ててて mailto:sage [2008/02/22(金) 10:52:10 ]
- なるほど〜
それじゃあ、そろそろ答え81って書いて提出します みなさんのおかげでいろいろわかりました どうもありがとうございました
- 91 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:26:14 ]
- >>90
han1[]="abcd\0e"; han2[]="abcd\0f";
- 92 名前:ててて mailto:sage [2008/02/22(金) 12:21:24 ]
- >>91
の場の場合もあるにはありますよね そこら辺の指定はまったくないんですよね 問題文 以下のプログラムは起動時に指定された2つのテキストファイルを比較し、 違う行があればその行番号を表示するプログラムです。 空白部分を埋めて、プログラムを完成させなさい。 という文章で自分で strcmp のバージョンは穴埋めはできたと思います 問題2 問題1のプログラムにおいてstrcmpを使用して読み込んだ2つのレコードが同じかどうか判断しています これをmemcmpを利用したロジックに作り直しなさい それで比較する部分のstrcmpをmemcmpに変えて書いたんですが読み込みするテキストファイルの指定は全くありません それで文字列分指定すればいいかなーと思っていたんですが・・・ >>90のようにそこまで深く考えたほうがいいのでしょうか? 意地悪問題すぎる
- 93 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:24:05 ]
- だから単に片方のをstrlen()+1すればいい
strlenも使用不可なのかな?でも自作するくらいならmemcmpも使わんしなw
- 94 名前:ててて mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 01:47:49 ]
- 大きい二次元配列の初期化ってどうやればいいんですか?
char buf2[20][20];char buf[256]; double dat[10000]; とかだったら。
- 96 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:06:36 ]
- >>95
ループで各要素に初期値を代入する。 2次元配列の場合は2重ループで初期値を代入する。 char buf[256];が文字列だったら、strcpy(buf, "");
- 97 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:09:13 ]
- その前に、本当に初期化する必要があるかどうかチェックしてね。
無駄に初期化する人が多いから。
- 98 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:15:11 ]
- >>96
それってstrcpy使う必要あるのか?
- 99 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:22:59 ]
- 初期化することって規約があることもあるんだぜ・・・。
- 100 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:25:44 ]
- 初期化する必要ない場合ってどういう場合?
LINUXでいいデバッガない?
- 101 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:26:19 ]
- 初期化する必要ない場合は初期化する必要ない場合
- 102 名前:96 mailto:sage [2008/02/23(土) 02:26:53 ]
- >>98
ヌル文字での初期化の場合ね。 buf[0] = '\0' でもいいんだが、好みの問題。
- 103 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:29:08 ]
- double data[10000]={0}だと初期化できてないみたいなエラーでるけどこれは
範囲あるの?
- 104 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:29:32 ]
- >>102
最適化すればオーバーヘッドなくなるのかな? まぁもともと無視できるほどの差だろうけど
- 105 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:30:57 ]
- >>103
規格では全て 0 で初期化されるはずだが。 警告出すコンパイラならあるけど。 ただ、コンパイラが糞だと知らん。
- 106 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 02:34:47 ]
- セミコロンがないとかじゃないよな
- 107 名前:デフォルトの名無しさん [2008/02/23(土) 03:15:36 ]
- www.shinetworks.net/cgi-bin/img-up/src/1203703846656.jpg
この、12行目〜16行目までの解説をお願い致します。 特に解らないのが、12行目の" if(argc > 1) { "の部分です。 配列argcが1より大きければ、と言う言でしょうか?
- 108 名前:デフォルトの名無しさん [2008/02/23(土) 03:19:31 ]
- コボラーさんがC言語覚えるのは結構大変?
- 109 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:19:36 ]
- 文字列の長さも確認せずに strcpy はやばいだろ。
- 110 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:20:38 ]
- 大変? とか気にしてる時点で脈は無いわ。
- 111 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 03:28:52 ]
- >>107
argcはコマンド引数の数+1。 コマンド行がhogeのときargcは1。 コマンド行がhoge arg1のときargcは2。 だからif(argc > 1)とはコマンド引数がひとつ以上あるということ。
- 112 名前:デフォルトの名無しさん [2008/02/23(土) 04:27:04 ]
- >>111
サンクスです
- 113 名前:デフォルトの名無しさん [2008/02/23(土) 04:28:35 ]
- >>111
>>だからif(argc > 1)とはコマンド引数がひとつ以上あるということ。 ないときは、あるんですかね?
- 114 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 04:31:58 ]
- ないときはないよ。そんときは、argcが1になる。
- 115 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 04:41:37 ]
- >だからif(argc > 1)とはコマンド引数がひとつ以上あるということ。
いや,2つ以上だろ.もしくは1つよりも多く.
- 116 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 04:42:24 ]
- argc==2なら引数は1だろ。
- 117 名前:デフォルトの名無しさん [2008/02/23(土) 05:09:25 ]
- ? ↓-此れは?
006: int main(int argc,char *argv[] ? >>113 ああああああぁぁあぁ… 永遠に繋げていく事か"! ? if( argc > 1, argv > 1, argc > 1) = argc[1] ?
- 118 名前:デフォルトの名無しさん [2008/02/23(土) 06:45:19 ]
- 頭が混乱してきた…整理ついたら、出直してきます
ありがとうございました
|

|