strに格納されている文字数を数えるプログラムです。
#include<stdio.h>
int rstrlen(char *);
int main(void)
{
char str[] = {"abcdefghijk"};
printf("文字数:%d\n",rstrlen(str));
return 0;
}
int rstrlen(char *p)
{
if(*p) {
p++;
printf(p);
return 1 + rstrlen (p);
}
elsereturn 0;
}
return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。
No.1ベストアンサー
- 回答日時:
rstrlen("abc")
→ (1 + rstrlen("bc"))
→ (1 + (1 + rstrlen("c")))
→ (1 + (1 + (1 + rstrlen("")))
→ (1 + (1 + (1 + (0))))
→ (1 + (1 + (1 + 0)))
→ (1 + (1 + (1)))
→ (1 + (1 + 1))
→ (1 + (2))
→ (1 + 2)
→ (3)
→ 3
()が付くのがコール,外れるのがリターンです。
カウントしている値は関数の中に格納されていると言えなくもない。
No.2
- 回答日時:
問題の関数は
int rstrlen(char *p){ ・・・ }
と定義されていますよね。
強いて言うならば、値はこの「int」の部分に格納されています。
関数は、void定義されているのでなければ、戻り値を格納するための
領域を一つ持っています。この関数の場合は「int」つまり整数値を
格納するための領域を一つ持っているわけです。具体的にどこに
置かれるかは処理系に依存します。
関数が別の関数を呼ぶ場合、この値はスタックと呼ばれる領域に
退避されます。(最初からスタックに置かれている場合もあります。)
関数から戻った時は、その関数の戻り値領域の値と、スタックに退避
されていた値とから、あらためて変数や戻り値の値を格納し直します。
そのようにして、最終的にmainにまで値が返されるわけです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaのCSVデータ読込についてです
-
DateTimePickerに値を入れたい...
-
このプログラミング誰か教えて...
-
ArrayListの要素数の上限
-
JavaScript内で得た値をVBScrip...
-
バイト配列からfloat型の数値を...
-
wsprintf関数の使い方について
-
DOSバッチで変数の値を変数名に...
-
JavaScript→HTMLへ値渡しする方法
-
byte配列→float型の値を読みlon...
-
C言語の変数(LSB)の合わせ込...
-
PSQLExceptionが発生する
-
matchesを否定文として使う方法...
-
BCD形式で時刻を!
-
Stringクラスの変数の格納アド...
-
ダブルクォーテーションを含む...
-
Evaluate()に文字列の形式の数...
-
char型での演算子
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルクォーテーションを含む...
-
wsprintf関数の使い方について
-
javaのCSVデータ読込についてです
-
ArrayListの要素数の上限
-
特定の文字列を複数抜き出した...
-
Stringクラスの変数の格納アド...
-
結合した文字列をファイル名に...
-
BCD形式で時刻を!
-
DateTimePickerに値を入れたい...
-
Evaluate()に文字列の形式の数...
-
実行シェルからCOBOLへパラメー...
-
hiddenの値を消したくない!
-
DOSバッチで変数の値を変数名に...
-
C言語の変数(LSB)の合わせ込...
-
excel vba 時間計算と条件分岐...
-
Javaの問題なのですが、「3文字...
-
matchesを否定文として使う方法...
-
JSPでの計算結果表示
-
8桁整数を限りなく短い文字列に...
-
指定した日付が何日前なのかを...
おすすめ情報