質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2504閲覧

C言語でstrlen を使わずに出力したいです。

hacch

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/14 06:29

C言語で、このプログラムは文字配列 char str[N]; (Nは任意)の中にある特定の文字target_charが含まれているか否かを返す関数
int IsExist(char str[], char target_char, int first_index, int last_index);
を以下にしたがって再帰的に定義しているものです。

str[first_index] 〜 str[last_index]の中に特定の文字があるかどうかを探す際に、

前半str[first_index] 〜 str[(first_index+last_index)/2]を調べ、無ければ後半のstr[(firs_index+last_index)/2+1]〜str[last_index]を調べる。

もし見つかれば 1 を返し、無ければ 0 を返す。
このプログラムを<string.h>を使わずに、すなわちstrlenやstrnlenを使わずに出力したいのですが、一例としてどのように書けばいいでしょうか。

#include<stdio.h>int IsExist(char str[],char target_char,int first_index,int last_index); int main(){ char str[64]; char c; int rc; printf("検索文字は?"); scanf("%c",&c); printf("文字列"); scanf("%s",str); rc = IsExist(str,c,0,(int)strlen(str)); printf("結果発表:%d",rc); } int IsExist(char str[],char target_char,int first_index,int last_index){ if(last_index<=first_index+1){ if(str[first_index]==target_char || str[last_index]==target_char) return 1; else return 0; } if(IsExist(str,target_char,first_index, (first_index+last_index)/2)==1) return 1; else return IsExist(str,target_char, (first_index+last_index)/2+1,last_index); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/14 06:36

コードにインデントがついてないので見にくいです。 コードをコピー&ペーストで貼り付けてくれませんか
guest

回答3

0

2分探索しているようですが、なんか必要があるのでしょうか?
int IsExist(char str[],char target_char,int first_index,int last_index); の呼び出しの代わりに

C

1 int i = 0; 2 while ((str[i] != 0) && (str[i] != c)) i++; 3 if (str[i] == c) rc = 1; 4 else rc = 0;

で十分なような、、。

投稿2020/06/14 06:59

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2020/06/14 07:24

以前の質問(今回の関数の作成そのものなど)を見ると、どこかの学校の課題のようで……。つまり、「2分探索を再帰で書くこと」や、「既存のstrlenを使わずに自前で処理すること」が課題の条件になっているのでしょう。
pepperleaf

2020/06/14 07:30

> 課題の条件になっている やっぱり、そんな条件が、、とすると結構難題!?
cateye

2020/06/14 07:54

とすると、ソートが必要ですね。
Daregada

2020/06/14 08:02

2分探索じゃないですね、申し訳ない。単に前半後半を再帰的に調べるだけですね。 「warningを無視して `return strchr(str, target_char) != NULL;` と書く」って解決方法はどうだろう。
pepperleaf

2020/06/14 08:06

> strchr() string.h を使うなとの事です。
Daregada

2020/06/14 08:12 編集

だから、「#inlcude <string.h>を書かず」に、warningを無視してstrchrを使う、という無理やりな解決法。string.h内にプロトタイプ宣言されている標準ライブラリを使うなとは書いていないから。 いや、まじめに提案しているわけじゃないので(丸投げ課題に付き合うのがアレだから)。
pepperleaf

2020/06/14 08:14

それを言うと、、strlen()もOK。
Daregada

2020/06/14 08:15

一応strlenとstrnlenは質問者の文章で直接「使わずに」と書いてあるのです。
guest

0

ベストアンサー

strlenと同等の関数を作ればいいんでしょ?

C

1int oreore_strlen(const char* str) { 2 int n = 0; 3 while ( *str != '\0' ) { 4 ++n; 5 ++str; 6 } 7 return n; 8}

んでもって
rc = IsExist(str,c,0,oreore_strlen(str));

投稿2020/06/14 06:59

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

文字列の終わりは、'\0'が来ると決められています
なので、文字列の中をを順番に見ていき、'\0'が来たらそこで止めればいいです

投稿2020/06/14 06:41

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問