文字列操作と文字操作関数

標準ライブラリ関数

文字列操作関数(標準ライブラリ関数)

文字操作関数(標準ライブラリ関数)


文字列操作・文字操作関数を自分で作ってみよう

 strlen: 文字列の長さ

/* mystrlen: s の長さを返す */
int mystrlen(char *s)
{
	int	i;

	i = 0;
	while( s[i] != '\0' )
		i++;
	return( i );
}
/* testmystrlen.c */
 1. 上の関数をforで書き換えてみよ!

 strcpy: 文字列のコピー

/* mystrcpy: t を s にコピーする;配列版 */
void mystrcpy(char *s, char *t)
{
	int	i;

	i = 0;
	while( (s[i] = t[i]) != '\0')
		i++;
}
/* testmystrcpy.c */
 2. 上の関数をforで書き換えてみよ!
/* mystrcpy: t を s にコピーする;ポインタ版1 */
void mystrcpy(char *s, char *t)
{
	while( (*s = *t) != '\0')
	{
		s++;
		t++;
	}
}
 3. 上の関数のwhileのブロックを式に書き換えてみよ!
  2つの式を1つにする(ヒント:カンマ演算子)
/* mystrcpy: t を s にコピーする;ポインタ版2 */
void mystrcpy(char *s, char *t)
{
	while( (*s++ = *t++) != '\0')
		;
}
/* mystrcpy: t を s にコピーする;ポインタ版3 */
void mystrcpy(char *s, char *t)
{
	while( *s++ = *t++ )
		;
}

 strcat: 文字列の連結

/* mystrcat: t を s の終わりに連結する;s が指す領域は十分大きいこと */
void mystrcat(char *s, char *t)
{
	int	i, j;

	i = j = 0;
	while( s[i] != '\0') /* s の終わりを探す */
		i++;
	while( (s[i++] = t[j++]) != '\0') /* t をコピーする */
		;
}
/* testmystrcat.c */
 4. 上の関数をforで書き換えてみよ!
 5. 上の関数をポインタ版に書き換えてみよ!

 strcmp: 文字列の比較

/* mystrcmp: s - t */
int mystrcmp(char *s, char *t)
{
	int	i;

	for( i = 0; s[i] == t[i]; i++ )
		if( s[i] == '\0' )
			return( 0 );
	return( s[i] - t[i] );
}
/* testmystrcmp.c */
/* mystrcmp: s - t */
int mystrcmp(char *s, char *t)
{
	for( ; *s == *t; s++, t++ )
		if( *s == '\0' )
			return( 0 );
	return( *s - *t );
}

 tolower: 小文字変換

/* mytolower: c を小文字に変換する;ASCIIのみ */
int mytolower(int c)
{
	if( c >= 'A' && c <='Z' )
		return( c + 'a' - 'A' );
	else
		return( c );
}
/* testmytolower.c */
 6. 大文字変換関数(mytoupper)を作ってみよ!(testmytoupper.c

 isdigit: 10進数字チェック

/* myisdigit: c が10進数字か?;ASCIIのみ */
int myisdigit(int c)
{
	return( c >= '0' && c <='9' );
}
/* testmyisdigit.c */
 7. 他のテスト関数を作ってみよう!
  (ライブラリ関数と比較検証するプログラムを作成してみよ!)

mystrncpy, mystrncat, mystrncmp を作ってみよう!

 8. mystrncpy を作ってみよ!(testmystrncpy.c
 9. mystrncat を作ってみよ!(testmystrncat.c
10. mystrncmp を作ってみよ!(testmystrncmp.c
参考(Linux man コマンドより)