[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:45 / Filesize : 237 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 23



1 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 12:49:22 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 22
pc11.2ch.net/test/read.cgi/tech/1196489491/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 101
pc11.2ch.net/test/read.cgi/tech/1197132472/

207 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:18:11 ]
キャスト変換はただその時の型を「一時的に強制的のその型にする」って理解すればいいと思うよ。
int main(void)

    〜〜〜
    return 0;

は、関数の章で学ぶと思うから、
今は明示的に書かなければならないと思っておけばOK。
あまり先飛びすぎても混乱するだけだしね。


208 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:46:21 ]
>>203
整数リテラル 10 はそれ自体としてintという型を持っている。
整数リテラル 2 もintで、int*intの結果はint型になることになっている。

209 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 22:52:30 ]
ってそういうことじゃないのか。

210 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:03:58 ]
>>194
とりあえず総じて何が聞きたいのか理解できん。
まずはここあたりを順に読んで、基本を覚えよ。
ttp://homepage1.nifty.com/toshio-k/prog/c/

211 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:29:52 ]
>>205
そのサイトは地雷原だから、他で勉強することを強くお勧めする。

212 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:31:17 ]
www9.plala.or.jp/sgwr-t/
ここオヌヌメ
友達から教わったけど、ここだけでCの基礎はバッチリ・・・?覚えたよ
ていうかC言語でググると一番上に出てくる

213 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:43:51 ]
>>212
あー、間違いをそれと知らずに教わるにはいいかも。

214 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:44:32 ]
どういうこっちゃ?

215 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:46:46 ]
今時 C から始めるのは損だよ。
C++ の本でも最初のうちは C と似たようなもんだし、
その延長で C++ まで覚えてしまった方が絶対得だよ。



216 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:47:18 ]
いきなりC++はどうだろうか。
C++はしょっぱなからクラス教えないっけ?

217 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:57:32 ]
C++が仕様としてカバーしているCとしての意味での、C++ってことじゃない?
まずCをやるんだけど、mallocとかFILE*とか、C++ではとって変わった部分を捨てて、
そのままC++のクラスなりnewなりをやれ、みたいなぁぁぁ

218 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 23:58:16 ]
>>214
間違いがあるってことだろ。間違いかどうかは微妙だけど、こういう書き方されるともにょる。
>つまり、書き換える必要のある文字列は、一旦文字型配列に格納してから処理をするのが無難だと言えます。
# 無難も何も、文字列リテラルを書き換えるのは論外なわけで……

219 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 00:08:39 ]
言葉が足りないんじゃないか
格納=コピーならいいけど、ポインタだけ格納してもね

220 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:29:34 ]
#include<stdio.h>
int main(void)

{
int i,d=97,c=65;
char ca;

scanf("%c",&ca);

for(i=65;i=<90;i++){
if(ca=c){
ca=d;
breke;
}
else{
i++,d++,c++;
}
}

printf("ca = %c ",ca);

return 0;
}

なんでこれがコンパイルできひんのじゃ!C言語死ねッ!!!!!

221 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:47:14 ]
if(ca=c)がおかしい
比較じゃなく代入してる

222 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:49:14 ]
ほんまや!!!!!



すまんかった・・・・・

223 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:49:59 ]
んでfor分の終了条件が=<なんて演算子はない。 <= だ。
ついでにbreak。brekeなんてない。

224 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:50:30 ]
ていうかコンパイルエラー見れば原因わかるんだけど、コンパイラ何使ってるんだ???

225 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:51:48 ]
ボーランド
プロンプト読めない



226 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:53:10 ]
hp.vector.co.jp/authors/VA017148/pages/install/bcc.html
オヌヌメ

227 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 03:56:51 ]
ありがじゅう。
お気に入り追加した

この恩は忘れるまで忘れない!

228 名前:デフォルトの名無しさん [2007/12/27(木) 04:03:27 ]
>>220
コンパイラタン(AA略)「なんでよ私一生懸命やってるじゃん!なんでそんなこと言うの!・・・ヒドイヨ・・・・・」

229 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:09:30 ]
コンパイラタン「と、途中でそんなの挿入したら、(エラーが)で、出ちゃうじゃない・・・・・!!!」

230 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:37:37 ]
その夜”ピ、ピ、”と言う不思議な音が深夜の闇の中木霊しつづけた・・・

231 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 04:43:19 ]
コンパイラタン「だ、だめっ!そこに"Shift"しちゃダメェェェェェ!!!」

232 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 07:24:49 ]
自分で色々検索して、何度も本を読み返したのですが判らないので質問です。
下記のソースでコンパイルは通るのですがIF文で条件外でも処理を実行してしまうようなのです。
どこが間違っているのか教えてください。お願いします。

#include <stdio.h>
#include <ctype.h>

main() {
  int i;
  int date[10];

  for(i=0 ; i<10 ; i++) {
    scan:
    printf("%d個目のデータ:", i+1);
    fflush(stdin);
    scanf("%d", &date[i]);
    if(isdigit(date[i]) == 0) {
        printf("数値を入力してください。\n");
        date[i] = 0;
        goto scan;
    }
 }
  printf("前から6個目のデータ:%d", date[5]);
  return 0;
}


233 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:13:57 ]
scanf("%d", &date[i]);
既にここで入力を数値として変換してしてるので scanfの戻り値を調べるといいよ。
isdigitは文字が('0'〜'9')かどうか判定する関数。
それとこの状況でわざわざコードを読みにくくするgotoを使用する意味はない。
whileとbreakで代用したほうがいい。

234 名前:232 mailto:sage [2007/12/27(木) 08:27:31 ]
>>233
ああ、そっか。%dだから受け取った時にすでに数値になってるんだ。なるほど。
じゃあこの場合文字を入れさせないようにするにはどういう風にしたら良いのでしょうか?

>whileとbreakで代用したほうがいい。
たしかにその通りです。気をつけます。

235 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:27:50 ]
>>232

> main() {
>   int i;
>   int date[10];
>
>   for(i=0 ; i<10 ; i++) {
>     scan:
>     printf("%d個目のデータ:", i+1);
>     fflush(stdin);
入力ストリーム(stdin)のフラッシュは未定義
したこと無いけどたぶんフラッシュされない。
>     scanf("%d", &date[i]);
>     if(isdigit(date[i]) == 0) {
isdigitの引数は文字。'1'は文字。1は数値。ってな感じ。
>         printf("数値を入力してください。\n");
>         date[i] = 0;
>         goto scan;
>     }
>  }
>   printf("前から6個目のデータ:%d", date[5]);
>   return 0;
> }
>




236 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:28:52 ]
>>232

まず、直接関係ないが、

        goto scan;

↑これは止めれ。こういうときはwhile文を使うのがセオリーだ。


isdigit()は「文字が数字かどうか」を判定する関数だよ。
scanf()で変換すると「数値」(int型)になるので、

    scanf("%d", &date[i]);
    if(isdigit(date[i]) == 0) {

これだとisdigit()は常に0を返すはず。
それに、scanf("%d", &date[i]); の場合、数字の入力を期待しているので、
それ以外の文字は入力されてもdate[i]に入らない。


237 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 08:38:22 ]
>>210

 main()

これでCマガジンに連載できるなんて…。・゚・(ノД`)・゚・。
休刊もやんぬるかな。



238 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:29:02 ]
>>237
省略した場合はintって決まりなかった?
だから一応正しいんじゃない?

239 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:31:09 ]
>>234
scanfの戻り値を利用する
scanfはスキャンに成功した数を返すから、
今回のケースで文字を入力されたら0が返る

240 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 09:35:56 ]
>>232
>scanf("%d", &date[i]);

241 名前:デフォルトの名無しさん [2007/12/27(木) 09:43:47 ]
途中でエンター押しちゃったw
>>232
>scanf("%d", &date[i]);
こういう取り方は文字/数字チェックそのものに意味が無いのでやめ

普通はバッファの文字列変数を用意させて、そこに入力させる。
それをisdigit()に通してクリアしたら、その時点でdate[i]に代入するようにすればいい。


242 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:13:33 ]
たぁすけてぇぇぇ!
結果がへんになる!!!

#include<stdio.h>
int main (void)
{
int a,c;
float b,d;
b=1,d=1;
scanf("%d",c);

for(a=1;a<=1000;a++){
b=b+d;
if(b*b==c){
break;
}
if(b*b<=c)
d=d*0.1;
}
printf(" %d の平方根は= %f ",c,b);
return 0;
}

243 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:21:53 ]
>scanf("%d",c);

244 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:27:04 ]
真に申し訳ございません。どうゆうこと?

245 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 11:30:23 ]
あああああああああああああああ
すいませんすいませんすいません!
もうしませんもうしませんもうしません!



246 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:22:54 ]
辞書検索の2分探索を下みたいに書いたんですけど、
????のところ(該当しなかった場合)が思いつきません。
助けてくださいです…

char a[20];
char b[20];
int hi,lo,i;



hi=i;
i=i/2;
lo=0;
while(1){
if(strcmp(b,a) < 0){
hi=i;
i=i-(hi-lo)/2;
}else if(strcmp(b,a) > 0){
lo=i;
i=i+(hi-lo)/2;
}else if(strcmp(b,a) == 0){
printf("あった");
break;
}else if( ???? ){
printf("そんなものなかった");
break;
}
}


247 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:30:21 ]
>>246
そこは if (lo > hi) を入れたいんだと思うが、
突っ込みどころが多すぎるからもうちょっと練り直して来い。

248 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:34:43 ]
せっかくなので1つ突っ込んでくだしあ

249 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:45:05 ]
if文の比較で最初の3通りのどれかに必ず含まれるから最後のelseは
絶対通過しない、まあelse外せばいいけど。
で、1ループでstrcmpは1回呼べばいいべ。
あと文字列が終わったのをチェックしないとね。
略の部分を略さないでテスト用に値設定したやつさらしてみてね。

250 名前:246と248 mailto:sage [2007/12/27(木) 14:55:46 ]
あ、ほんとだ。
ちょとまってください。

251 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:10:06 ]
#include <stdio.h>
int main(){
int i,j;

for(i=1;i<=9;++i)
printf("%2d ",i);
printf("\n--------------------------\n");

for(i=1;i<=9;++i){
for(j=1;j<=9;++j)
printf("%2d ",i*j);
printf("\n");
}

return 0;


for文の練習で書いた上の九九を表示するプログラムをwhile文だけで書けないかなぁと思って

252 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:10:38 ]
>>251の続き

#include <stdio.h>
int main(){
int i=1;

while(i<=9){
printf("%2d ",i);
i++;
}
printf("\n--------------------------\n");

i=1;
int j=1;
while(i<=9){
while(j<=9){
printf("%2d ",i*j);
j++;
}
printf("\n");
i++;
}

return 0;
}


このように書いてみたのですが1の段以降改行だけでプログラムが終了してしまいます
どうやったら上手く動かせるでしょうか

253 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:13:52 ]
>>252
jの値がどういう風に変化するか追ってみよう。


254 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:13:58 ]
>>252
while (j<=9) のループ抜けたらj を1に戻さないと。

255 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:20:50 ]
あーjが9のままだから次以降のループはスキップされちゃうのか
ヒントありがとうございました



256 名前:246他 mailto:sage [2007/12/27(木) 15:54:11 ]
せっかくレスくれたのに放置ですみません。
またあとで伺いにきます。

かしこ

257 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:38:48 ]
大学が決まって4月がで暇なのでC言語を勉強しようと思っているのですが

苦しんで覚えるC言語
ttp://homepage3.nifty.com/mmgames/c_guide/
というサイトを見つけたのですがこのサイトはどうでしょうか?

初心者にいいサイトや本を教えてください

258 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:56:00 ]
それでいいよ

259 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 17:31:45 ]
>>257
おk

260 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 17:37:17 ]
いいのかよw

261 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:13:44 ]
>>257
そのサイトはダメ出しされているよ。

262 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:33:23 ]
ダメ出しすれば著者を超えた気分になれるよね

263 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:40:27 ]
あんたは小石を跨いでも小石を超えた気分になれるのか?

264 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:54:03 ]
aho

265 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:57:48 ]
>>257
そのサイトで勉強すると、>19や>205みたいなことを書くようなお馬鹿になっちゃうよ。



266 名前:デフォルトの名無しさん [2007/12/27(木) 19:03:50 ]
>>257
参考になるけど、やっぱり本がいいよ。
独習Cとか、やさしいCね。

267 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:04:05 ]
どうなろうと後で矯正するからいいよ。

268 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:05:44 ]
まあ初心者はどのサイトから始めてもいいと思うけど、
そこに留まらずいくつかのサイトを回った方がいいよ
そして宿題スレで宿題を解く
ついでに簡単なデータ構造、アルゴリズムも学ぶ
こんな感じで基礎はおk

269 名前:デフォルトの名無しさん [2007/12/27(木) 19:09:25 ]
他のサイトを見るたびに、こんなやり方があったのか!
ってなって悲しくなるぞ。

270 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:37:32 ]
他のサイトを見るたびに、こんなやり方があったのか!
ってなって嬉しくなるぞ.

271 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 19:50:21 ]
特定のサイトにいついたことはないなあ
適当に検索して、
その日見つけたサイトをぱらぱらと読む
サイト規模にもよるけど1日ありゃ十二分に読み終われるとこばっかだし

272 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:08:52 ]
おれのお勧め、更新は止まってるけど・・・
mikata.curiocube.com/index.php

273 名前:デフォルトの名無しさん [2007/12/27(木) 20:10:38 ]
WisdumSoftでC言語の基礎文法を覚えて
(例文の内容にアニメ好きがかもしだされているが)
Programing Placeでデータ構造とかその他の
知識を学ぶ。
で理解できない所(ポインタとかかな)を重点的に
載せてる本でさらに学ぶ。
あとは、経験値をつけていくだけだ。

274 名前:273 [2007/12/27(木) 20:11:47 ]
間違えたWisdomSoftだ

275 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:02:21 ]
変数宣言と代入ってつなげられるんですか?



276 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:05:44 ]
>>275
いいえ、それは初期化です

277 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:10:49 ]
苦しんでわけわかめ
違うサイトで勉強するわ
お勧め教えてくだしあ

278 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:17:21 ]

猫でも解るって、ぶっちゃけどう?

携帯からサーセソw

279 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:21:20 ]
>>275
int i;
i = 0;
を指してるなら可能だし
int i=0;
なら>>276の言うとおり「初期化」という。

280 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:33:14 ]
初期化と代入はどう違うんですか?

281 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:36:05 ]
初期値を指定するのが初期化。

初期化と代入ではできることが違う場合がある。
配列は一気に全要素を初期化できるけど、
一気に全要素に代入することはできず、
1要素ずつしか代入できない、とか。

282 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:36:06 ]
const int x;
x = 1; //Error
//代入できNEeeee!!!

const int x = 1; //OK
//Yeah! 初期化最高!!

283 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:36:51 ]
>>280
ぜんぜん違う。初期化される前の値が何であるかは神のみぞ知る。

284 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:39:47 ]
以下の二つのコードで、
仮に最適化されないとするなら、
生成される機械語コードは同じですか?
それとも違う?

(1)
int array[2] = {1,2};

(2)
int array[2];
array[0] = 1;
array[1] = 2;

285 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:40:47 ]
コンパイラ次第



286 名前:284 mailto:sage [2007/12/27(木) 21:41:47 ]
すいません、ちょっと質問が悪いかも

初期化と代入は内部的に全く異なる処理をやっているんですか?
それともただ確保後に代入してるだけですか?内部的に。

287 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:43:53 ]
コンパイラ次第

288 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:44:59 ]
手元の環境で機械語コード生成してみればいいじゃん

289 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 21:48:46 ]
rep movsd 使って初期化してるかもしれないし、
mov で初期化してるかもしれないし。
そのあたりはコンパイラ次第としか言いようが無い。

290 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:22:17 ]
>>284
多分,全然違うコードになってる。

291 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 22:42:54 ]
>>284
>仮に最適化されないとするなら、
これが殆ど意味がないのでなんとも言えない。

292 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:45:59 ]
ってかマシン語レベルでの差なんて最適化どうこう言う前にコードが変われば変わる可能性はある。
空行(セミコロンのみの行)に対してNOPを吐くか消されるかだってコンパイラしだい。
予想でいいのならいくらでも応えられるけどな。

>>284のコードなら最適化関係なく同じコードが吐かれるかもね。

293 名前:デフォルトの名無しさん [2007/12/27(木) 23:55:28 ]
そんな事、気にしてたら禿げるぞ

294 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:58:41 ]
これ以上禿げたら腋毛が無くなる
びっくりするほどなくなる

295 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 00:17:48 ]
機械語レベルを気にする必要があるくらい禿てたら手段くらい知ってるだろ



296 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 01:40:46 ]
代入と初期化の違いは配列やれば判るよ
配列の初期化はOKだけど配列全体の代入はNG
なんでえ〜?ってのはポインタやると判る

297 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:13:30 ]
Java厨です。

プロトタイプ宣言ってなんですか?
C言語ってなんで関数を使う前に宣言しとく必要があるんですか?
昔ながらの慣習みたいなものですか?
宣言無くてもコンパイル通るなら、
コンパイラの手抜きと違うんですか?
関数宣言がないときと宣言も定義もないときと
ちゃんとコンパイラは違うエラー出しますよね?

298 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:26:15 ]
適度に手抜きしてくれないとコンパイルに時間がかかってしょうがないじゃないか

299 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:41:53 ]
分割コンパイルしないなら無くても良いんじゃない?

300 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:49:42 ]
C始めて3日くらいです
fopenとfcloseの使い方がようやく分かって、ポインタについては良くわかりません(変数の代わりなのかな?くらい
そこであるテキストファイルを開いて、その中にある文字列(英数字)からある文字列(setofなど)を探したいです
最終的にはある文字列が見つかる→その後ろ〜〜バイト(もしくは〜〜行)をコピーして、別のファイルにペースト というところまでやりたいのですが
検索しようとしている時点で詰まっています。ソースコードは以下です

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define BUFFER_SIZE 200

main(){
       char buffer[BUFFER_SIZE],name[BUFFER_SIZE];
     FILE *fp;
      printf_s("test.txtを開こうとしました\n\n\n\n");
fp = fopen("test.txt", "r");
printf_s("検索文字列を代入してください\n");
scanf_s("%s",&name);
printf_s("%sを検索しています\n",name);
if ( !fp ){
printf("ファイルオープンエラー\n");
return 0;
}

while( fgets(buffer, BUFFER_SIZE, fp) ){
if(!strcmp(name,buffer)){
printf_s("%sが見つかりました!\n",name);
break;
}
}
fclose(fp);
}

301 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:54:03 ]
以上のソースに対して、テキストファイルを用意します
『aaxaa        ←改行
bbxb         ←改行
cxc【EOF】』
すると、cxcを入力しても反応してくれず、strcmpのところでcxc\nに変更すると、ifの見つかりました文が出ます
コレに対する問題点としては
1.改行まできっちり一致しなければ見つからないことになる
2.bbxbで完全一致であるが、bxbでも部分一致で見つかったことにしたい
  しかし、今では1行読み込みのために不可能(BUFFER_SIZEを実数にしても無理)

というところです
〜〜の関数使ったほうがいいよ、とか、こういうルーチンで考えるとできるよ、っていうのがあればお願いします
わかりにくい質問で申し訳ありませんが、宜しくお願いします

302 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 02:55:05 ]
>>300-301
strstr()

303 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:02:33 ]
>>302
ありがとうございます。今色々なページを見てきたのですが…
返り値としてポインタとして返すんですね。ポインタと見た瞬間に顔が引きつったのですが…

void TestStrStr(void)
{
char *s1 = "abcdef";
char *s2 = "de";
char *cp;
cp = StrStr(s1, s2);
printf("'%s'の中に現れる'%s'という文字列は%d文字目にある.\n", s1, s2, cp - s1 + 1);
}

このようなソースを見つけました。printfの一番後ろにあるcp-s1+1はおそらく何文字目にあるか指定してくれてるようなのですが
ポインタ同士を引き算しているこのような場合、実数として計算をしているのでしょうか?


304 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:13:28 ]
>>303
メモリアドレスを計算している。s1が100番地に格納されているとすると、メモリ上は
100 101 102 103 104 105 106 (メモリアドレス)
  a    b    c    d    e    f     \0
のようなイメージ。

strstr()は、見つかった部分のポインタを返すから、"de"を見つけたならアドレス103を返し、それをcpに代入している。
printf()の最後の引数はcp - s1 + 1、つまり103 - 100 + 1で4を返す。

305 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:23:02 ]
>>304
なるほど。だからポインタは便利だって言われてるんですね…メモリ上の一番基礎になる数字を返すから…
ありがとうございます
もうちょっとポインタのこと勉強してからやってみます。とりあえず今日は寝ます
ありがとうございました



306 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 03:26:31 ]
>>305
すまん、ちゃんと質問読んでなかったw

ポインタは「アドレスという数字」を格納する変数。
アドレスと聞くと拒否反応が出るかもしれないが、メモリ上の位置を表す何の変哲も無いただの数字。
ただし、四則演算のうち可能なのは加算減算だけで乗除は出来ない。やっても意味のある数字が得られないから。
正しくはインクリメント、デクリメントだけど、これについての詳細はググってくれ。

307 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 04:18:50 ]
ポインタやる時はメモリマップ作って見ると良いよ
スタック、データ、コードのそれぞれのセグメントがどんな配置か判っているとポインタの理解が早くなる






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<237KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef