みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

検索するプログラミング

C言語の問題で、ユーザが文字列を入力し、半角英数字の入力(最大でも1000文字)を改行があるまで受け付ける。次に、ユーザに検索する文字列(最大でも半角20文字)を入力させ、はじめに入力された文字列内にあるかどうかを表示するプログラムを作成する。配列の外部を参照しないように注意する。そのプログラム内で以下の関数を完成させる。
int str_srch (char str [], char srch_str[]) :
文字列strの中に文字列srch_strが含まれていれば、1を返し、含まれていなければ0を返す関数とする。

このような感じになると思うのですがどなたか分かりませんか?

int str_compare(char *s1, char *s2)
{
//文字列s1の先頭にs2が含まれていれば等しいければ1、
//そうでなければ0を返す

//while文を利用して、s2の1文字目からs2がヌル文字になるまで
//繰り返し、s1の対応する文字と等しいかどうかチェック

//s2の最後の文字まで等しければ、1
//そうでなければ0を返す
}

int str_length(char *str)
{
//文字列strの長さを返す
}

int str_srch(char *str, char *srch_str)
{
int strlen, srch_strlen;
int i,j=0;

strlen =str_length(str); //文字列strの長さ
srch_strlen =str_length(srch_str); //文字列srch_strの長さ


for(i=0;i<strlen;i++){
//strのi文字目からにsrch_strがあるかどうか
 j=j+str_compare(&str[i], srch_str)
}

//jは文字列srch_strが文字列strに何回含まれているか、を表す
//jが1より多くなれば1を返し
//jが0なら0を返す
}

投稿日時 - 2007-10-26 23:07:51

QNo.3464147

困ってます

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

下記のようにコーディングしてみました。
試してみた限りでは正しそうですが、
ご自分で検証してください。
(そもそも、文字列の比較ならば、strncmp関数が用意されているので、
それを使った方がよろしいかと。)

#include <stdio.h>

const static int MAX_INPUT = 1000;
const static int MAX_SEARCH = 20;
const static int TRUE = 1;
const static int FALSE = 0;

int str_srch(const char* str , const char* strstr);
int str_compare(const char* s , const char* t);
void replace_lf_null(char* s);


int main(void)
{
char input[MAX_INPUT]; // 検索対象文字列
char search[MAX_SEARCH]; // 検索文字列
printf("input > ");
fgets(input , MAX_INPUT , stdin);
replace_lf_null(input);
printf("search > ");
fgets(search , MAX_SEARCH , stdin);
replace_lf_null(search);
printf("input : %s\n" , input);
printf("search : %s\n" , search);
int result = str_srch(input , search);
if(result)
{
printf("found.\n");
}
else
{
printf("not found.\n");
}
return 0;
}


// str 検索対象文字列
// strstr 検索文字列
// 戻り値 str中にstrstrを発見した場合、TRUE
int str_srch(const char* str , const char* strstr)
{
const char* ch;
for(ch=str ; *ch != '\0' ; ch++)
{
int comp = str_compare(ch , strstr);
if(comp)
{
return TRUE;
}
}
return FALSE;
}

// 文字列sと文字列tを先頭から比較
// 戻り値 一致した場合、TRUE
int str_compare(const char* s , const char* t)
{
const char* p;
const char* q;
for(p=s , q=t ; *p!='\0' && *q!='\0' ; p++ , q++)
{
if(*p != *q)
{
return FALSE;
}
}
return TRUE;
}

// 改行文字をNULL文字に置換
void replace_lf_null(char* s)
{
char* ch;
for(ch=s ; *ch!='\0' ; ch++)
{
if(*ch == '\n')
{
*ch = '\0';
break;
}
}
}

投稿日時 - 2007-10-27 08:55:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

学校の課題か何かですか? もし課題なら、自分で考えなきゃ意味が無いですよね。

で、課題で無いなら、C言語の標準ライブラリにある関数を使う。すでにあるものをわざわざ作るなんて、時間の無駄ですから。
例えば、string.h には次のような関数があります。

文字列を比較する int strcmp(const char *str1, const char *str2);
文字列を照合する int strcoll(const char *str1, cnst char *str2);
文字列長を計算する size_t strlen(const char *str);
文字列を検索する char *strstr(const char *str1, const char *str2);

ん~、strstrを使ったら終わってしまった。
http://www9.plala.or.jp/sgwr-t/lib/strstr.html

投稿日時 - 2007-10-28 15:14:24

ANo.1

> このような感じになると思う

ということでしたら、現在日本語で書かれている部分を
C言語のコードにして、main関数など必要な記述を行なった上、
コンパイルしてみてください。

ご自分で「ああでもない、こうでもない」と試行錯誤しながら
完成させるのが、実はいちばんの近道で、かつ、実力が付く
やり方でもあります。

投稿日時 - 2007-10-26 23:48:04

あなたにオススメの質問