/* 文字列を扱う関数を作る 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; }