• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC++ 再帰関数)

VC++再帰関数で文字列の長さを求めるプログラム

このQ&Aのポイント
  • VC++再帰関数を使ってキーボードから読み込んだ文字列の長さを求めるプログラムです。
  • プログラムの中では、unk_rという再帰関数が定義されており、引数として文字列の先頭を渡すことで文字列の長さを再帰的に求めます。
  • 具体的な処理としては、unk_r関数では、現在の文字がヌル終端文字(0x00)であるかどうかをチェックし、ヌル終端文字でない場合は再帰的に次の文字へ進み、文字列の長さをカウントします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#154655
noname#154655
回答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は文字列の終了の意味です。 私はあまり文章が得意ではないのでうまく説明できていません(ミスがあるかもしれません)。 ですけど、これで分からなければあきらめた方がいいと思います。

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (7)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

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

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

まあまあ、そんなによってたかって難詰するより、 ここは華麗にスルーしてあげるのが吉。

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

> ごめんなさい。読んでもあまり理解できなかったのです。 ということは、ある程度は理解できたわけですね。 どんな本を、いつ、どのようにして、どれだけ読んだのかを明らかにしてください。 また、ある程度理解できた内容をご自身の言葉で説明してください。

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19406)
回答No.4

>細かいところまで具体的に解説お願いします。 無理。入門書より詳しく解説するには、解答欄の文字数が少な過ぎる。 >ごめんなさい。読んでもあまり理解できなかったのです。 残念ですが、貴方にC言語は向いていません。 もし「趣味でやっている」のであれば、時間の無駄です。C言語の事は忘れましょう。 もし「選択科目なので必要」なのであれば、科目の選択を誤まりました。この科目は貴方には修得不可能なので、この科目の単位取得は諦めましょう。 もし「必須科目なので必要」なのであれば、学校の選択を誤まりました。この科目は貴方には修得不可能なので、進級、卒業は諦めましょう。 もし「就職先で必要」なのであれば、進路の選択を誤まりました。プログラミングは貴方には向いていないので、今の内定は辞退し、他の職業を探しましょう。 ここまで読んで「でも、死ぬ気で覚えたい」と思うのなら、即刻「他人に頼るのは今日まで」にしましょう。 人に聞いているうちは「絶対に覚えるのは無理」ですから、このサイトの利用も含め、他人に聞くのはやめましょう。 そして、入門書に書いてある事が判らなくても良いですから、ともかく「載っているサンプルを打ち込んで見て、実際に動かしてみる」と良いでしょう。 最初は「どうしてそういう結果になるのかの理由」は判らなくても構いません。 理由は判らなくても構いませんから「こうやったら、こういう結果になる」っていうのを1つ1つ覚え、それを積み重ねて行って下さい。 プログラムというのは、突き詰めれば「こうやると、こうなる」の集合体なのですから、良く使う「こうやると、こうなる」さえ覚えてしまえば、プログラムを組めるようになるでしょう。 内容が判らなくても良いですから、とにかく、サンプルが載ってる入門書を、ボロボロになるまで繰り返して何百回か読みましょう。 「死ぬ気で覚えたい」のなら、それくらいの事、出来ますよね?

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

えぇと, 「入門書を読んでもあまり理解できなかった人」が「行、単語ひとつひとつ細かいところまで具体的に解説」されて理解できるものなのだろうかと首をかしげてみる. まあ, 私には「入門書を読んでもあまり理解できなかった人であっても完全に理解できるような説明」をする能力はありませんが. っつ~か, 「再帰」って分かりますか?

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

>行、単語ひとつひとつ細かいところまで具体的に解説お願いします。 って、 >#include <stdlib.h> とか、 >char *i; まで説明しろってこと? それこそNo.1氏と同感。 最低でも「どこがわからないか」絞るくらいのことはできませんか?

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

入門書を最低1冊以上と処理系のドキュメントを熟読してください。 話はそれからです。

situmontya
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 再帰プログラム

    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); } else return 0; } return 1 + rstrlen (p);の部分で再帰をし1をプラスすることにより文字数をカウントしmainのprintfで文字数を表示しているのですがカウントしている値はどこに格納していてどのようにmainに返しているのかが分かりませんでした。教えてください。

  • 再帰関数でポインタのインクリメントがうまくいかない 

    再帰関数で標準出力に文字列を表示するプログラムを書きました。 #include <stdio.h> void display(char *p); int main(void) { display("おちょめちょめ"); return 0; } void display(char *p) { if(*p){ printf("%c",*p); dis(p++); } } 実行するとbがいっぱい出てきます。?? 一番最後のコードですが、()の中を p=p+1 p+=1 p+1 などにするとちゃんと おちょめちょめ と表示されます。なぜでしょうか。

  • 文字の数値化 関数化

    文字を入力されたとき、数値入力を促す関数を作りたいのですが、 最初の文字が文字ならエラーメッセージがちゃんと出るのですが、 最初の文字が数字ならエラーメッセージが出てくれません。 アドバイスお願いいたします。 tew2 ← エラー出る 2test ← エラー出ない #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> float ss_input(void); int main(){ int i; int pop; printf("何人の入力しますか(3人以内)->"); do{ pop=ss_input(); if(pop >3) printf("3人以内でお願いします\n"); }while(pop<1 || pop>3); return 0; } float ss_input(void){ char p[100]; float st; int i=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("数値を入力してください->"); scanf("%s",p); continue; } else{ break; } } st=atof(p); return st; }

  • 再帰プログラム

    #include<stdio.h> int rstrlen(char*); int main(void) { char str[100]; printf("文字列を入力してください\n"); gets(str); printf("文字数は %d です\n",rstrlen(str)); return 0; } int rstrlen(char *p) { if(*p){ p++; return 1+rstrlen(p); } else return 0; } 文字数を計算するプログラムです。 if(*p)の*pとはNULLを表しているのですか?

  • 関数の再帰処理

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657... という数列(フィボナ数列)を再帰処理でだしたいのですが・・・・・ include <stdio.h> int function( int ); int main( void ){ int n; do { printf( "0 以上の整数値を入力して下さい→ " ); scanf( "%d", &n ); }while ( n < 0 ); printf( "計算結果: %d\n", function( n ) ); getchar(); getchar(); return 0; } int function( int n ){ //フィボナの処理(function)の再帰呼び出しによる } function内に再帰処理を用いてprintf( "計算結果: %d\n", function( n ) );で画面出力したいのですが・・・・・・。

  • malloc関数の使い方について(初心者)

    膨大なデータ数を扱うためにmalloc関数を用いて配列にデータを格納し、それを表示するプログラムを考えました。コンパイルはできるのですが、実行するとエラーが起こります。freeの開放の仕方が間違っているのでしょうか?よろしくお願いします。 /*ソース*/ #include <stdio.h> #include <stdlib.h> #define N 130000 int main(void) { double *p; int i; p = malloc(N); if(!p){ printf("割り当てエラー"); exit(1); } for(i=0;i<N;i++){ p[i]=i; printf("%f\n",p[i]); } free(p); }

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • c言語の再帰で(関数呼び出し)+1がわからない

    再帰がどのように処理されているのか理解するために、再帰の時に +1 してみたところ 0! = 1 1! = 2 2! = 5 3! = 16 4! = 65 5! = 326 6! = 1957 7! = 13700 8! = 109601 9! = 986410 10! = 9864101 となりました。 普通の階乗の値を求めた最後に +1され、それが戻されると思ったのですが違いました。 これはどういう処理がされているのでしょうか? #include <stdio.h> int kaijo(int); int main() { int i; for (i = 0; i < 11; i++) printf("%d! = %d\n", i, kaijo(i)); return 0; } int kaijo(int n) { if (n == 0) return 1; else return n * kaijo(n - 1) + 1; }

  • malloc関数(strtok関数の自作版)につきまして分からないこと

    malloc関数(strtok関数の自作版)につきまして分からないことがあります。 以下のプログラムにmallo関数がフリーする最適な位置を明示しなさいといわれました。 文字が分離した時にfreeすると助言されたのですが いまいち理解できません・・・。 条件式の中で使用するともいわれていました。(おそらくif文・・・。) 色んな意見を参考にしたいので詳しい方助言のほうよろしくおねがいします。 なおプログラムはほかの箇所を変更したり、他の場所でもmalloc関数を使用することが認められています。 またfreeする場所はメイン関数ではなくあくまでもstrtok関数の中で宣言するようです。 よろしくお願いします。 #include <string.h> #include <stdio.h> #include <stdlib.h> main(){ char* s2 = ",/"; char* result; char* r1; char* r2; char* r3; char* r4; result = strtok("//123//,45/,678,9/","/,"); r1 = strtok(NULL, s2); r2 = strtok(NULL, s2); r3 = strtok(NULL, s2); r4 = strtok(NULL, s2); printf("%s\n",result); printf("%s\n",r1); printf("%s\n",r2); printf("%s\n",r3); printf("%s\n",r4); return; } char *strtok(char *s1, const char *s2) { int i,len; char *str1, *str2 , *str3; static char *tok ; static char* mstr; if(s1 != NULL) { str1 = s1; } else { str1 = tok; } str2 = str1 + strspn(str1, s2); /* strspnを利用 */ if (*str2 == '\0') { return (NULL); } len = 1; i = 0; while(*(str2 + i) != '\0'){ len++; i++; } mstr = (char*)malloc(sizeof(char)*len); if(mstr == (NULL)) { return 0; } i = 0; while(*(str2 + i) != '\0'){ *(mstr + i) = *(str2 + i ); i++; } *(mstr + i ) = '\0'; str3 = mstr + strcspn(mstr, s2); /* strcspnを利用 */ if (*str3 != '\0'){ *str3 = '\0'; str3 = str3 + 1; } tok = str3; return (mstr); }

  • 文字列中の空白部の読み込みの方法を教えてくださいm(_ _)m

    いつもお世話になっています!!キーボードから以下のような文字列を読み込み、大文字のみをカウントするプログラムを作りたいのですが、空白部になると次の文字を判定せずにプログラムが停止してしまいます。。。どなたかアドバイスをお願いしますm(_ _)m ○文字列 My name is Marly. ○プログラムソース #include<stdio.h> #include<stdlib.h> #include<string.h> int main(void){ char *s; int i,j=0,m; s=(char*)malloc(sizeof(char)); printf("please iput sentens\n"); scanf("%s",s); m=strlen(s); for(i=0;i<m;i++){ if( 0x41 <= s[i] && s[i] <= 0x5A) j++; } printf("%d",j); free(s); return(0); }