ページ 11

プログラミングの問題について

Posted: 2011年1月28日(金) 05:19
by akatuki
プログラムの問題で質問がありますどうか回答を教えてください。

文字列text[]と文字列pat[]が与えられたとき、文字列text中に文字列patが含まれるときは最初に現れるその文字列の先頭の位置(0~)を返し、含まれないときは-1を返す関数searchを作成せよ。また、その関数を用いて、2つの文字列text[]とpat[](空白は含まない)を入力すると関数searchの値を返すプログラムを作成せよ。ここでtextとpatには長さ1以上の文字列が入っているものとする。
(例:text[]=”thisisatesttextdate”の中に、pat[]=”this”は0の位置に、
pat[]=”text”は7の位置に現れる)ただし#include<string.h>や strstr()などを使わないで。
ちなみに私は、
#include<stdio.h>
#include<string.h>
int search(char text[],char pat[])
{
const char *p = strstr(text,pat);
if(p) return p -text;
return -1;
}
int main(void)
{
char text[128],pat[128];
scanf("%s %s", text, pat);
printf("%d\n", search(text,pat));
return 0;
}
この様に編集すると、
thisisatesttextdata
this
と入力すると
0
と画面に表示され
thisisatesttextdata
test
と入力すると
7
と画面に表示され
thisisatesttextdata
abc
と入力すると
-1
と画面に表示されました。

このプログラムを#include<string.h>や strstr()などを使わないでできるプログラムを教えてください。よろしくお願いします。

Re: プログラミングの問題について

Posted: 2011年1月28日(金) 05:47
by bitter_fox
akatuki さんが書きました: このプログラムを#include<string.h>や strstr()などを使わないでできるプログラムを教えてください。よろしくお願いします。
strstr関数を使わずにやるのであれば、strstr関数がやっていることを自前で実装すれば良いですね。

で、strstr関数の挙動としては、(第一引数をarg1、第二引数をarg2とする(両方ともchar*型))

arg1が'\0'でない間、(ループ1)
iをarg1のオフセットとして、arg2[j]が'\0'になるまで、同値かを調べていきます。(ループ2)
(同値かどうかを調べる式は、iがarg1のオフセットとなるので
arg1[i+j] == arg2[j]
になります)

もし、途中で違っていたらループ2を抜けます。
また、'\0'になった場合はarg2の終点まで完全一致したという事なのでiの値を返します。

ループ1を抜けた場合は、arg1の終点までarg2が見つからなかったという事なので、-1を返します

Re: プログラミングの問題について

Posted: 2011年1月28日(金) 07:54
by さかまき
>strstr関数を使わずにやるのであれば、strstr関数がやっていることを自前で実装すれば良いですね。
ちょっと検索すれば、すぐにソースがみつかります。
http://detail.chiebukuro.yahoo.co.jp/qa ... 1228633452
などが、処理内容を理解するうえでも参考になると思います。

試験問題としてはいいかもしれませんが、もし課題だとするとあまり良い問題じゃないですね。