■キーボードより読み込んだ文字列の長さを求めるプログラムを再帰関数を使って作る
#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を使うのに必要などなど。
よろしくお願いします。
No.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は文字列の終了の意味です。
私はあまり文章が得意ではないのでうまく説明できていません(ミスがあるかもしれません)。
ですけど、これで分からなければあきらめた方がいいと思います。
No.7
- 回答日時:
再帰ってのは、きちんと基本が理解できてから取り組むべき課題です。
しかしながら、
>このプログラムについて、行、単語ひとつひとつ細かいところまで具体的に解説お願いします。どういう働きをしているのか等。
こんなお願いをしているということは、基本が理解できていないということの良い証拠。
なので、まずは入門書を頭からきっちり読み直して、少なくとも、↑こんな情けないお願いをしなくても済む程度に理解を深めることをおすすめします。
No.5
- 回答日時:
> ごめんなさい。
読んでもあまり理解できなかったのです。ということは、ある程度は理解できたわけですね。
どんな本を、いつ、どのようにして、どれだけ読んだのかを明らかにしてください。
また、ある程度理解できた内容をご自身の言葉で説明してください。
No.4
- 回答日時:
>細かいところまで具体的に解説お願いします。
無理。入門書より詳しく解説するには、解答欄の文字数が少な過ぎる。
>ごめんなさい。読んでもあまり理解できなかったのです。
残念ですが、貴方にC言語は向いていません。
もし「趣味でやっている」のであれば、時間の無駄です。C言語の事は忘れましょう。
もし「選択科目なので必要」なのであれば、科目の選択を誤まりました。この科目は貴方には修得不可能なので、この科目の単位取得は諦めましょう。
もし「必須科目なので必要」なのであれば、学校の選択を誤まりました。この科目は貴方には修得不可能なので、進級、卒業は諦めましょう。
もし「就職先で必要」なのであれば、進路の選択を誤まりました。プログラミングは貴方には向いていないので、今の内定は辞退し、他の職業を探しましょう。
ここまで読んで「でも、死ぬ気で覚えたい」と思うのなら、即刻「他人に頼るのは今日まで」にしましょう。
人に聞いているうちは「絶対に覚えるのは無理」ですから、このサイトの利用も含め、他人に聞くのはやめましょう。
そして、入門書に書いてある事が判らなくても良いですから、ともかく「載っているサンプルを打ち込んで見て、実際に動かしてみる」と良いでしょう。
最初は「どうしてそういう結果になるのかの理由」は判らなくても構いません。
理由は判らなくても構いませんから「こうやったら、こういう結果になる」っていうのを1つ1つ覚え、それを積み重ねて行って下さい。
プログラムというのは、突き詰めれば「こうやると、こうなる」の集合体なのですから、良く使う「こうやると、こうなる」さえ覚えてしまえば、プログラムを組めるようになるでしょう。
内容が判らなくても良いですから、とにかく、サンプルが載ってる入門書を、ボロボロになるまで繰り返して何百回か読みましょう。
「死ぬ気で覚えたい」のなら、それくらいの事、出来ますよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
反転した数値を表示させるやり方
-
sscanfとscanfの違いがよくわか...
-
C++
-
fgets関数を使用したときの文字...
-
C言語のステップ数をカウントす...
-
charと%c , %s の関係について
-
C言語 空白の行(改行のみ)が...
-
作ったプログラミングC何だけど...
-
if文の判定条件('||'と'&&'の使...
-
スペースで区切って数字を入力
-
C言語で16進数文字列から16進数...
-
C言語、単語ごとに改行したい
-
1行の文字列を時間差で表示する...
-
strstrを利用しない文字列検索...
-
C++でランレングス符号化のプロ...
-
C言語の初心者です。これを実行...
-
ブランクのチェック
-
文字列中に含まれる文字の個数...
-
プログラミング シーザー暗号 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
fgets関数を使用したときの文字...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
Cで「大文字、小文字の判定」は...
-
1行の文字列を時間差で表示する...
-
エディットボックスに入力され...
-
[Java]文字列分割
-
文字列の途中に「0」がある場...
-
教えていただけませんか?C言語...
-
atoiでの文字列以外のエラー処...
-
fgetsでバッファ残留文字列を無...
おすすめ情報