■キーボードより読み込んだ文字列の長さを求めるプログラムを再帰関数を使って作る

#include <stdlib.h>
int unk_r(char*p)
  {
   if(*p == 0x00)
   return(0);
  else
   return(1+unk_r(p+1));
  }

int main()
  {
   char *i;
   i = (char *)malloc(20);
   scanf("%s",i);
   printf("%d\n",unk_r(i));
  }


このプログラムについて、行、単語ひとつひとつ細かいところまで具体的に解説お願いします。どういう働きをしているのか等。

例えば #include <stdlib.h> はmallocを使うのに必要などなど。
よろしくお願いします。

A 回答 (8件)

プログラムの勉強はどのくらいやられているのでしょうか?


短いのであれば、もっと簡単なことから勉強した方がいいと思います。


#include <stdlib.h> //必要なものと覚えておけばいいです
//文字列の長さを求める(再起)関数
//引数:文字列のアドレス(char*p)
//戻り値:文字数(int)
int unk_r(char*p)
{
if(*p == 0x00) //最後の文字(0x00)に来た
return(0); //最後の文字に来たのでunk_r関数を呼ばなくてもいい
else  //最後の文字(0x00)ではない
return(1+unk_r(p+1)); //p+1で次の文字を指すようにする
              //1+で戻ってきた文字数に1を足す
}
//メイン関数
int main()
{
char *i; //文字列の先頭アドレスを入れるもの
i = (char *)malloc(20); //文字列データを保存するメモリ領域を確保して「i」に入れる
scanf("%s",i); //キーボードから入力。「%s」は文字列を入力
printf("%d\n",unk_r(i)); //表示(unk_r(i)で文字数を調べる)「%d」は文字数、「\n」は改行
return (0); //main関数終了(プログラム終了)
}


unk_r(p+1)で最後の文字まで動かします。
最後まで来たら、0を返します(0x00をカウントしないように)。
1+unk_r(p+1)で帰ってきた値に1を足します(これを繰り返します)。
main関数に戻って来た時には、文字数が求められているというわけです。
0x00は文字列の終了の意味です。

私はあまり文章が得意ではないのでうまく説明できていません(ミスがあるかもしれません)。
ですけど、これで分からなければあきらめた方がいいと思います。
    • good
    • 0
この回答へのお礼

理解できました。回答ありがとうございました。
どうも難しい本を参考にしてしまっていたようです。

お礼日時:2009/05/19 18:15

再帰ってのは、きちんと基本が理解できてから取り組むべき課題です。


しかしながら、
>このプログラムについて、行、単語ひとつひとつ細かいところまで具体的に解説お願いします。どういう働きをしているのか等。
こんなお願いをしているということは、基本が理解できていないということの良い証拠。
なので、まずは入門書を頭からきっちり読み直して、少なくとも、↑こんな情けないお願いをしなくても済む程度に理解を深めることをおすすめします。
    • good
    • 0
この回答へのお礼

すみません時間なくて急いで書いたもので大雑把すぎました。
ありがとうございました。

お礼日時:2009/05/19 18:14

まあまあ、そんなによってたかって難詰するより、


ここは華麗にスルーしてあげるのが吉。
    • good
    • 0
この回答へのお礼

荒れてしまって申し訳ございません。

お礼日時:2009/05/19 18:14

> ごめんなさい。

読んでもあまり理解できなかったのです。

ということは、ある程度は理解できたわけですね。
どんな本を、いつ、どのようにして、どれだけ読んだのかを明らかにしてください。
また、ある程度理解できた内容をご自身の言葉で説明してください。
    • good
    • 0
この回答へのお礼

すみません時間なくて急いで書いたもので大雑把すぎました。
ありがとうございました。

お礼日時:2009/05/19 18:13

>細かいところまで具体的に解説お願いします。



無理。入門書より詳しく解説するには、解答欄の文字数が少な過ぎる。

>ごめんなさい。読んでもあまり理解できなかったのです。

残念ですが、貴方にC言語は向いていません。

もし「趣味でやっている」のであれば、時間の無駄です。C言語の事は忘れましょう。

もし「選択科目なので必要」なのであれば、科目の選択を誤まりました。この科目は貴方には修得不可能なので、この科目の単位取得は諦めましょう。

もし「必須科目なので必要」なのであれば、学校の選択を誤まりました。この科目は貴方には修得不可能なので、進級、卒業は諦めましょう。

もし「就職先で必要」なのであれば、進路の選択を誤まりました。プログラミングは貴方には向いていないので、今の内定は辞退し、他の職業を探しましょう。

ここまで読んで「でも、死ぬ気で覚えたい」と思うのなら、即刻「他人に頼るのは今日まで」にしましょう。

人に聞いているうちは「絶対に覚えるのは無理」ですから、このサイトの利用も含め、他人に聞くのはやめましょう。

そして、入門書に書いてある事が判らなくても良いですから、ともかく「載っているサンプルを打ち込んで見て、実際に動かしてみる」と良いでしょう。

最初は「どうしてそういう結果になるのかの理由」は判らなくても構いません。

理由は判らなくても構いませんから「こうやったら、こういう結果になる」っていうのを1つ1つ覚え、それを積み重ねて行って下さい。

プログラムというのは、突き詰めれば「こうやると、こうなる」の集合体なのですから、良く使う「こうやると、こうなる」さえ覚えてしまえば、プログラムを組めるようになるでしょう。

内容が判らなくても良いですから、とにかく、サンプルが載ってる入門書を、ボロボロになるまで繰り返して何百回か読みましょう。

「死ぬ気で覚えたい」のなら、それくらいの事、出来ますよね?
    • good
    • 0
この回答へのお礼

すみません時間なくて急いで書いたもので大雑把すぎました。
ありがとうございました。

お礼日時:2009/05/19 18:13

えぇと, 「入門書を読んでもあまり理解できなかった人」が「行、単語ひとつひとつ細かいところまで具体的に解説」されて理解できるものなのだろうかと首をかしげてみる.


まあ, 私には「入門書を読んでもあまり理解できなかった人であっても完全に理解できるような説明」をする能力はありませんが.
っつ~か, 「再帰」って分かりますか?
    • good
    • 0
この回答へのお礼

すみません時間なくて急いで書いたもので大雑把すぎました。
ありがとうございました。

お礼日時:2009/05/19 18:12

>行、単語ひとつひとつ細かいところまで具体的に解説お願いします。


って、
>#include <stdlib.h>
とか、
>char *i;
まで説明しろってこと?
それこそNo.1氏と同感。

最低でも「どこがわからないか」絞るくらいのことはできませんか?
    • good
    • 0
この回答へのお礼

すみません時間なくて急いで書いたもので大雑把すぎました。
ありがとうございました。

お礼日時:2009/05/19 18:12

入門書を最低1冊以上と処理系のドキュメントを熟読してください。


話はそれからです。
    • good
    • 0
この回答へのお礼

ごめんなさい。読んでもあまり理解できなかったのです。

お礼日時:2009/05/19 09:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング

おすすめ情報