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

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

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

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

Q&A

解決済

4回答

3549閲覧

C言語 strstr関数の自作をしています

P_Beginner

総合スコア99

C

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

0グッド

1クリップ

投稿2018/04/29 12:09

前回の質問でstrstr関数の自作を試みたのですが、色々だめだったらしいので
新しくプログラムをたてたのですが、セグメントエラーが出るのでどうしたらよいでしょうか。

可能な限り改善、改良できるところをあげてほしいです。

str1にstr2が複数含まれる場合は最初の先頭位置のみわかればよいです。
一応入れてませんがmain関数の方に
strlen(str1)<strlen(str2)
のif文を追加するつもりです。

C

1#include<stdio.h> 2 3char *strPointSearch(char *str1,char *str2); 4 5int main(void) 6{ 7char str1[]={},str2[]={},point; 8 9printf("str1を入力---->"); 10gets(str1); 11printf("str2を入力---->"); 12gets(str2); 13 14point=*strPointSearch(str1,str2); 15printf("%d番目\n",point); 16 17return 0; 18} 19 20char *strPointSearch(char *str1, char *str2) 21{ 22int i, j, k; 23 24if(*str2 == '\0') 25return str1; 26else 27{ 28for(i = 0;*(str1 + i) != '\0';i++) 29{ 30if(*(str1 + i) == *str2) 31{ 32for(j = i, k = 0;*(str1 + j) == *(str2 + k);j++, k++); 33if(*(str2 + k) == '\0') 34return str1 + i; 35} 36} 37return NULL; 38} 39}

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

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

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

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

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

Zuishin

2018/04/29 12:16

strstr は自作しなくてもあります。他人に作ってもらっても構わないなら標準のものをつくってください。あるいはソースを見ればそれで解決でしょう。
Zuishin

2018/04/29 12:16

自作ということなら自分で作ってください。
guest

回答4

0

ベストアンサー

google で "c strstr 実装" で検索して、実装例をいろいろさがして、自分のコードと比較してみてください。

そして、ぜひ テストコードを書いてみてください。
考えられるいろいろいろなケースを列挙し、実行結果が仕様と一致するかを確認するテストプログラムを書くのです。

テストコード例は以下でみることができます。
https://sourceware.org/git/?p=glibc.git;a=blob;f=string/test-strstr.c;h=acf6ff8224608737701046a421faed2be9f52f68;hb=HEAD

https://github.com/gcc-mirror/gcc/blob/e11be3ea01eaf8acd8cd86d3f9c427621b64e6b4/gcc/testsuite/gcc.c-torture/execute/builtins/strstr.c

投稿2018/04/30 07:41

編集2018/09/19 17:21
katoy

総合スコア22324

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

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

0

急がば回れではないですが、GWですので、
是非、名著「プログラミング言語C」共立出版、カーニハン著・石田晴久訳を読んでみることをお勧めします。(石田先生はあちらにいかれてしまったのですね)
標準関数strxxxなどを、どのように作るかの説明もあったような気がします(うろ覚えです。間違っていたらすみません。本を探したけどありませんでした)。
私はこの本で教えられ、教えもしました。

投稿2018/04/29 12:45

ikapy

総合スコア1167

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

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

pepperleaf

2018/04/29 13:03

> 名著「プログラミング言語C」 止めましょう。 名著かも知れませんが、古すぎ。文法も違いすぎ。記憶に間違いなければ、関数の宣言も古い形式の筈
ikapy

2018/04/29 13:14

了解しました。
raccy

2018/04/29 13:59

著者名にリッチーの名が無い… > pepperleaf さん 第二版であればANSI C(C89/C90)準拠であるため、それほど古いとは言えません。互換性や特殊な環境でC99対応コンパイラがないなどの理由で未だにC90が使われる場合があります。と言っても、Cを全く知らない初心者が読むような本じゃないのは確かですけど。
pepperleaf

2018/04/30 01:06

raccyさん、 確かに。第二版、忘れてました。話は聞いたけど、もういいや、だったのも確かです。 ただ、初心者に、C90とか、 C99 と言っても意味不明では? それと、現実のプログラムは、使っているコンパイラの仕様に依存するので、最近、興味無くなっています。(と言うより、追いかけきれない)
guest

0

可能な限り改善、改良できるところをあげてほしいです。

まず、インデントしてください。
記述方法に好き嫌いはあるでしょうが、全く無いと見ずらいです。(バグが見つけにくい)
*(str1 + i) => str1[i] と書いた方が見やすいですが、拘りがありますか?
見つからなかった場合、NULL を返しますが、その場合、mainがではどうなるでしようか? => ほぼ、確実にエラー

strlen(str1)<strlen(str2)

無くても問題ない筈。 => 見つからないだけ。
とりあえず気づいた範囲で。

投稿2018/04/29 12:29

pepperleaf

総合スコア6383

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

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

0

私なら以下のように作ります。動作未確認。

c

1int myCompare(const char* p, const char* q) 2{ 3 for(; q; p++, q++){ 4 if(*p != *q){ 5 return 0; 6 } 7 } 8 return 1; 9} 10char* myStrstr(const char* p, const char* const q) 11{ 12 for(; p;p++){ 13 if(myCompare(p, q) ){ 14 return p; 15 } 16 } 17 return NULL; 18}

投稿2018/04/29 12:27

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問