/* 文字列を扱う関数を作る 2-8.c */
#include <stdio.h>
/* 今までの知識を応用して、文字列を扱う関数を幾つか試作してみる。
(string.h を取り込まなくても文字列を扱える) */
/*--文字列の長さを知る
非常に簡単で、終端記号が見つかるまで一つずつ配列要素を読み、
見つかったら数えた数を返す。*/
int strlen_(char str[])
{int i=0;
while (str[i]!='\0') i++;
return i;
}
/*--文字列の代入をする
文字列2の終端が来るまで、2の配列要素を一つずつ文字列1の配列要素に代入。
終端一つ前で抜けるので、最後に終端記号(2の最後)を入れる。この関数は値を
返さないので void。*/
void strcpy_(char str1[],char str2[])
{int i=0;
while (str2[i]!='\0') {
str1[i]=str2[i];
i++;
} str1[i]=str2[i];
}
/*--文字列の後に新しく文字列を付加する
文字列1の終わりを捜し、それ以降に文字列2の要素を一つずつ代入する。
上と同じ遣り方。この関数も値を返さないので void。*/
void strcat_(char str1[],char str2[])
{int i=0,j=0;
while (str1[i]!='\0') i++;
while (str2[j]!='\0') {
str1[i+j]=str2[j];
j++;
} str1[i+j]=str2[j];
}
/*--文字列の比較をする
文字列1が終わるまで配列要素を一つずつ比較する。途中で違う箇所があれば
抜けて、当該箇所の文字値の減算値を返す。*/
int strcmp_(char str1[],char str2[])
{int i=0;
while (str1[i]!='\0') {
if (str1[i]!=str2[i]) break;
i++;
}
return str1[i]-str2[i];
}
/*--文字列の中から文字列を捜す-- 文字列の長さを知る関数(上で作ったもの)を使用
文字列1の各要素と文字列2の各要素を2の要素数だけ、順番に一つずつ比較する
(内側のloop)。違う要素があればloopを抜けて、1の要素を次に進め同じ事を繰り
返す(外側のloop)。内側のloopで各要素が全て一致すれば、loopを進めていた数と
文字列2の長さが同じになるので、その時の文字列1の要素番号+1(配列初めの要
素番号が0なので、+1にしてある)を返し、見つからなければNULL(=0)を返す。*/
int strstr_(char str1[],char str2[])
{int i,j;
for (i=0; i<=strlen_(str1)-strlen_(str2); i++) {
for (j=0; j<strlen_(str2); j++) if (str1[i+j] != str2[j]) break;
if (j==strlen_(str2)) return i+1;
}
return NULL;
}
//-----
int main(void)
{ char a[50],b[50],dmy[50];
printf("文字列1を入力:");gets(dmy);
strcpy_(a,dmy);
printf("文字列2を入力:");gets(dmy);
strcpy_(b,dmy);
printf("\n");
printf("文字列1の長さ=%d \t2の長さ=%d\n\n",strlen_(a),strlen_(b));
printf("文字列1と2の違い=%d\n",strcmp_(a,b));
if (strstr_(a,b)==NULL)
printf("%sは%sに含まれない\n",b,a);
else printf("%sは%sの%d文字目にある\n",b,a,strstr_(a,b));
strcat_(a,b);
printf("\n文字列1に2を付加すると %s\n長さ=%d\n",a,strlen_(a));
return 0;
}