「C言語練習」 2-8.c   ・前へ
/*  文字列を扱う関数を作る  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;
}


(前に戻る)