Powered by SmartDoc

ソフトウェア概論A/B (2010/10/05)
Ver. 1.0

2010年11月5日
栗野 俊一
kurino@math.cst.nihon-u.ac.jp
http://edu-gw2.math.cst.nihon-u.ac.jp/~kurino/2010/soft/soft.html
ソフトウェア概論 A/B2010年11月5日 の資料

目次

講義資料

当日の OHP 資料

当日のOHP資料です。

本日の概要

9.文字列の基本( Text p.207 - 223 )

-->

講義で利用するサンプルプログラム

sample-001

Download : sample-001.c ( SJIS 版 )

sample-001.c
/*
 * 文字列の配列への読み込み (scanf/gets は危険)
 */

#include <stdio.h>

/*
 * main
 */

#define	PASS_LEN	4		/* 鍵の長さ */
#define	PASS_SIZE	(PASS_LEN)+1	/* 鍵を納める配列のサイズ(長さ+1) */
#define	ARY_SIZE	2

#define	LOCK	1			/* 錠 */
#define	KEY	0			/* 鍵 */

#define	ever	(;;)

int main ( void ) {
  char str_ary[ARY_SIZE][PASS_SIZE];
  int i;

  printf ( "鍵をかける 4 文字長さのパスワードを入力してください : " );
  scanf ( "%s", str_ary[LOCK] );		/* 危険 !! */

  for ever {	/* 鍵が開くまで、ずっと周る */
	printf ( "\n現在、鍵がかかっています\n" );
	printf ( "鍵を開けるためのパスワードを入力してください : " );
	scanf ( "%s", str_ary[KEY] );		/* 危険 !! */

	for ( i = 0; i < PASS_LEN; i++ ) {	/* パスワードチェック */
		if ( str_ary[KEY][i] != str_ary[LOCK][i] ) {	/* 違っている部分がある !! */
			break;			/* 後は調べる必要なし */
		}
	}

	if ( i < PASS_LEN ) {	/* 途中までしか調べてなければ、一致しなかった */
		printf ( "パスワードが一致していません !!!\n" );
	} else {		/* そうでなければ、一致したので.. */
		printf ( "パスワードが一致しました\n" );
		break;		/* 鍵を開ける */
	}
  }

  printf ( "鍵は開いています。\n" );

  return 0;
}
入力例
NAZO
ARE?
KORE
U-MU
NAZO
sample-001.c の実行結果
C:\usr\c\> sample-001
鍵をかける 4 文字長さのパスワードを入力してください : NAZO

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : ARE?
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : KORE
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : U-MU
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : NAZO
パスワードが一致しました
鍵は開いています。
C:\usr\c\> 

sample-002

Download : sample-002.c ( SJIS 版 )

sample-002.c
/*
 * 文字列の配列への読み込み (scanf/gets は危険)
 */

#include <stdio.h>

/*
 * main
 */

#define	PASS_LEN	4		/* 鍵の長さ */
#define	PASS_SIZE	(PASS_LEN)+1	/* 鍵を納める配列のサイズ(長さ+1) */
#define	ARY_SIZE	2

#define	LOCK	1			/* 錠 */
#define	KEY	0			/* 鍵 */

#define	ever	(;;)

int main ( void ) {
  char str_ary[ARY_SIZE][PASS_SIZE];
  int i;

  printf ( "鍵をかける 4 文字長さのパスワードを入力してください : " );
  scanf ( "%s", str_ary[LOCK] );		/* 危険 !! */

  for ever {	/* 鍵が開くまで、ずっと周る */
	printf ( "\n現在、鍵がかかっています\n" );
	printf ( "鍵を開けるためのパスワードを入力してください : " );
	scanf ( "%s", str_ary[KEY] );		/* 危険 !! */

	for ( i = 0; i < PASS_LEN; i++ ) {	/* パスワードチェック */
		if ( str_ary[KEY][i] != str_ary[LOCK][i] ) {	/* 違っている部分がある !! */
			break;			/* 後は調べる必要なし */
		}
	}

	if ( i < PASS_LEN ) {	/* 途中までしか調べてなければ、一致しなかった */
		printf ( "パスワードが一致していません !!!\n" );
	} else {		/* そうでなければ、一致したので.. */
		printf ( "パスワードが一致しました\n" );
		break;		/* 鍵を開ける */
	}
  }

  printf ( "鍵は開いています。\n" );

  return 0;
}
入力例
LOCK
AAAA
DAME
IYADAIYADA
sample-002.c の実行結果
C:\usr\c\> sample-002
鍵をかける 4 文字長さのパスワードを入力してください : LOCK

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : AAAA
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : DAME
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : IYADAIYADA
パスワードが一致しました
鍵は開いています。
C:\usr\c\> 

sample-003

Download : sample-003.c ( SJIS 版 )

sample-003.c
/*
 * 文字列の配列への読み込み (scanf/gets は危険)
 */

#include <stdio.h>

/*
 * main
 */

#define	PASS_LEN	4		/* 鍵の長さ */
#define	PASS_SIZE	(PASS_LEN)+1	/* 鍵を納める配列のサイズ(長さ+1) */
#define	ARY_SIZE	2

#define	LOCK	1			/* 錠 */
#define	KEY	0			/* 鍵 */

#define	ever	(;;)

int main ( void ) {
  char str_ary[ARY_SIZE][PASS_SIZE];
  int i;

  printf ( "鍵をかける 4 文字長さのパスワードを入力してください : " );
  scanf ( "%4s", str_ary[LOCK] );		/* サイズを指定する */

  for ever {	/* 鍵が開くまで、ずっと周る */
	printf ( "\n現在、鍵がかかっています\n" );
	printf ( "鍵を開けるためのパスワードを入力してください : " );
	scanf ( "%4s", str_ary[KEY] );		/* バッファオーバフローをさける安全な方法 */

	for ( i = 0; i < PASS_LEN; i++ ) {	/* パスワードチェック */
		if ( str_ary[KEY][i] != str_ary[LOCK][i] ) {	/* 違っている部分がある !! */
			break;			/* 後は調べる必要なし */
		}
	}

	if ( i < PASS_LEN ) {	/* 途中までしか調べてなければ、一致しなかった */
		printf ( "パスワードが一致していません !!!\n" );
	} else {		/* そうでなければ、一致したので.. */
		printf ( "パスワードが一致しました\n" );
		break;		/* 鍵を開ける */
	}
  }

  printf ( "鍵は開いています。\n" );

  return 0;
}
入力例
LOCK
AAAA
DAME
IYADAIYADA
HELP
LOCK
sample-003.c の実行結果
C:\usr\c\> sample-003
鍵をかける 4 文字長さのパスワードを入力してください : LOCK

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : AAAA
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : DAME
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : IYADAIYADA
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : HELP
パスワードが一致していません !!!

現在、鍵がかかっています
鍵を開けるためのパスワードを入力してください : LOCK
パスワードが一致しました
鍵は開いています。
C:\usr\c\> 

sample-004

Download : sample-004.c ( SJIS 版 )

sample-004.c
/*
 * 文字列 "12345" を書式指定して表示 [ cf. Text p.213 List 9-4 ]
 */

#include <stdio.h>

/*
 * main
 */

int main ( void ) {
  char str[] = "12345";

  printf ( " 12345678 \n" );
  printf ( "+--------+\n" );
  printf ( "|%s|\n", str );	/* そのまま */
  printf ( "|%3s|\n", str );	/* 最低 3 桁 (長ければ、指定なしと同じ) */
  printf ( "|%.3s|\n", str );	/* 3 桁まで (それより長い部分は切捨て) */
  printf ( "|%8s|\n", str );	/* 最低 8 桁 (短ければ、空白が補われ右寄せになる) */
  printf ( "|%-8s|\n", str );	/* 最低 8 桁 (短ければ、空白が補われ左寄せになる) */

  return 0;
}
sample-004.c の実行結果
C:\usr\c\> sample-004
 12345678 
+--------+
|12345|
|12345|
|123|
|   12345|
|12345   |
C:\usr\c\> 

sample-005

Download : sample-005.c ( SJIS 版 )

sample-005.c
/*
 * 名前を尋ねて挨拶 (文字列の読込み) [ cf. Text p.213 List 9-4 ]
 */

#include <stdio.h>

/*
 * main
 */

#define	NAME_LENGTH	40	/* 日本語の場合は1文字が 2 byte になる事に注意 */

int main ( void ) {
  char name[NAME_LENGTH+1];	/* 名前を入れる文字配列 */

  printf ( "御名前は : " );
  scanf ( "%40s", name );	/* 必ず長さを指定する事 !! / 配列名の前には '&' は不要 */

  printf ( "こんにちは、%sさん\n", name );

  return 0;
}
入力例
栗野俊一
sample-005.c の実行結果
C:\usr\c\> sample-005
御名前は : 栗野俊一
こんにちは、栗野俊一さん
C:\usr\c\> 

sample-006

Download : sample-006.c ( SJIS 版 )

sample-006.c
/*
 * 文字列の配列の初期化 ? [ cf. Text p.214 List 9-6 ]
 */

#include <stdio.h>

/*
 * main
 */

#define	STRING_SIZE	6
#define	ArraySizeOf(Ary)	(sizeof(Ary)/sizeof(Ary[0]))

int main ( void ) {
  char str_ary[][STRING_SIZE] = {
	"Turbo",
	"NA",
	"DOHC"
  };
  int i;

  for ( i = 0; i < ArraySizeOf(str_ary); i++ ) {
	printf ( "str_ary[%d] = \"%s\"\n", i, str_ary[i] );
  }

  return 0;
}
sample-006.c の実行結果
C:\usr\c\> sample-006
str_ary[0] = "Turbo"
str_ary[1] = "NA"
str_ary[2] = "DOHC"
C:\usr\c\> 

sample-007

Download : sample-007.c ( SJIS 版 )

sample-007.c
/*
 * 文字列の配列に複数の文字列を入力する [ cf. Text p.215 List 9-7 ]
 */

#include <stdio.h>

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)
#define	NUMBER_OF_STRINGS	3

int main ( void ) {
  char str_ary[NUMBER_OF_STRINGS][STRING_SIZE];
  int i;

  for ( i = 0; i < NUMBER_OF_STRINGS; i++ ) {
	printf ( "str_ary[%d] : ", i );
	scanf ( "%127s", str_ary[i] );
  }

  for ( i = 0; i < NUMBER_OF_STRINGS; i++ ) {
	printf ( "str_ary[%d] = \"%s\"\n", i, str_ary[i] );
  }

  return 0;
}
入力例
S500L
A8
SLK
sample-007.c の実行結果
C:\usr\c\> sample-007
str_ary[0] : S500L
str_ary[1] : A8
str_ary[2] : SLK
str_ary[0] = "S500L"
str_ary[1] = "A8"
str_ary[2] = "SLK"
C:\usr\c\> 

sample-008

Download : sample-008.c ( SJIS 版 )

sample-008.c
/*
 * 文字列の長さ [ cf. Text p.216 List 9-8 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * str_length : 文字列の長さを求める
 */

unsigned int str_length ( const char str[] ) {
	unsigned int length;

	for ( length = 0; str[length] != EOS; length++ ) {	/* 文字走査の基本パターン */
		/* do nothing */
	}

	return length;
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char str[STRING_SIZE];
  int i;

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", str );

  printf ( "文字列「%s」の長さは%uです。\n", str, str_length ( str ) );

  return 0;
}
入力例
SEC
sample-008.c の実行結果
C:\usr\c\> sample-008
文字列を入力してください : SEC
文字列「SEC」の長さは3です。
C:\usr\c\> 

sample-009

Download : sample-009.c ( SJIS 版 )

sample-009.c
/*
 * 文字列の長さ [ 再帰版 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * substr_length : 後文字列の長さを求める (再帰版)
 */

unsigned int substr_length ( const char str[], int pos ) {

  if ( str[pos] == EOS ) {	/* 空文字列 */
	return 0;		/* 長さは 0 */
  } else {
	return substr_length ( str, pos + 1 ) + 1;	/* 更に後文字列の長さを求めて 1 ふやす */
  }
}

/*
 * str_length : 文字列の長さを求める (後部分列を利用する)
 */

unsigned int str_length ( const char str[] ) {

  return substr_length ( str, 0 );		/* str 自身の長さは、後部分文字列 <str,0> の長さに等しい */
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char str[STRING_SIZE];
  int i;

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", str );

  printf ( "文字列「%s」の長さは%uです。\n", str, str_length ( str ) );

  return 0;
}
入力例
SEC
sample-009.c の実行結果
C:\usr\c\> sample-009
文字列を入力してください : SEC
文字列「SEC」の長さは3です。
C:\usr\c\> 

sample-010

Download : sample-010.c ( SJIS 版 )

sample-010.c
/*
 * 文字列の走査 [ cf. Text p.216 List 9-9 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * put_string : 文字列を表示する(改行しない)
 */

void put_string ( const char str[] ) {
  unsigned int i;

  for ( i = 0; str[i] != EOS; i++ ) {
	putchar ( str[i] );
  }
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char str[STRING_SIZE];
  int i;

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", str );

  put_string ( str );
  putchar ( '\n' );

  return 0;
}
入力例
SEC
sample-010.c の実行結果
C:\usr\c\> sample-010
文字列を入力してください : SEC
SEC
C:\usr\c\> 

sample-011

Download : sample-011.c ( SJIS 版 )

sample-011.c
/*
 * 文字列の走査 [ 再帰版 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * put_substring : 後部分文字列を表示する
 */

void put_substring ( const char str[], int pos ) {

  if ( str[pos] != EOS ) {		/* 空文字列でない */
	putchar ( str[pos] );		/* 先頭の文字を出力し.. */
	put_substring ( str, pos + 1 ); /* 残りは再帰で処理 */
  }
	/* EOS なら空文字列 "" なので何もしなくてもよい */
}

/*
 * put_string : 文字列を表示する(改行しない)
 */

void put_string ( const char str[] ) {

  put_substring ( str, 0 );		/* str の出力は <str,0> の出力 */
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char str[STRING_SIZE];
  int i;

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", str );

  put_string ( str );
  putchar ( '\n' );

  return 0;
}
入力例
SEC
sample-011.c の実行結果
C:\usr\c\> sample-011
文字列を入力してください : SEC
SEC
C:\usr\c\> 

sample-012

Download : sample-012.c ( SJIS 版 )

sample-012.c
/*
 * 文字列内の数字を数える [ cf. Text p.219 List 9-10 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * _str_dcount : 文字列内の数字の個数をそれぞれ求める
 */

void str_dcount ( const char str[] , int cnt[]) {
  unsigned int i;

  for ( i = 0; str[i] != EOS; i++ ) {
	if ( '0' <= str[i] && str[i] <= '9' ) {
		cnt[str[i]-'0']++;
	}
  }
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char str[STRING_SIZE];
  int cnt[ '9' - '0' + 1 ] = {0};		/* '0' 〜 '9' で 10 文字 (植木算に注意) */
  int digit;

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", str );

  str_dcount ( str, cnt );

  for ( digit = '0'; digit <= '9'; digit++ ) {
	printf ( "'%c' : %d\n", digit, cnt[ digit - '0'] );
  }

  return 0;
}
入力例
3.1415926532897265
sample-012.c の実行結果
C:\usr\c\> sample-012
文字列を入力してください : 3.1415926532897265
'0' : 0
'1' : 2
'2' : 3
'3' : 2
'4' : 1
'5' : 3
'6' : 2
'7' : 1
'8' : 1
'9' : 2
C:\usr\c\> 

sample-013

Download : sample-013.c ( SJIS 版 )

sample-013.c
/*
 * 文字列内の数字を数える [ 再帰版 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * _substr_dcount : 後部分文字列内の数字の個数をそれぞれ求める
 */

void substr_dcount ( const char str[] , int pos, int cnt[] ) {

  if ( str[pos] != EOS ) {
	cnt[str[pos]-'0']++;
	substr_dcount ( str, pos + 1, cnt );
  }
}

/*
 * _str_dcount : 文字列内の数字の個数をそれぞれ求める
 */

void str_dcount ( const char str[] , int cnt[] ) {

	substr_dcount ( str, 0, cnt );
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char str[STRING_SIZE];
  int cnt[ '9' - '0' + 1 ] = {0};		/* '0' 〜 '9' で 10 文字 (植木算に注意) */
  int digit;

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", str );

  str_dcount ( str, cnt );

  for ( digit = '0'; digit <= '9'; digit++ ) {
	printf ( "'%c' : %d\n", digit, cnt[ digit - '0'] );
  }

  return 0;
}
入力例
3.1415926532897265
sample-013.c の実行結果
C:\usr\c\> sample-013
文字列を入力してください : 3.1415926532897265
'0' : 0
'1' : 2
'2' : 3
'3' : 2
'4' : 1
'5' : 3
'6' : 2
'7' : 1
'8' : 1
'9' : 2
C:\usr\c\> 

sample-014

Download : sample-014.c ( SJIS 版 )

sample-014.c
/*
 * 文字列をコピーする [ 再帰版 ]
 */

#include <stdio.h>

/*
 */

#define	EOS	'\0'

/*
 * _substr_copy : 後部分列コピー ( dst には十分な.. )
 */

void substr_copy ( const char src[] , int spos, char dst[], int dpos ) {

  if ( src[spos] == EOS ) {	/* 空文字列ならば、空文字列をコピー */
	dst[dpos] = EOS;
  } else {			/* そうでないなら */
	dst[dpos] = src[spos];				/* 先頭をコピーし.. */
	substr_copy ( src, spos + 1, dst, dpos + 1 );	/* 後は再帰で処理. */
  }

}

/*
 * _str_copy : 文字列をコピー ( dst には src の内容がコピーできる十分な領域が必要 )
 */

void str_copy ( const char src[] , char dst[] ) {

	substr_copy ( src, 0, dst, 0 );	/* 全体をコピーするには、後部分文字列をコピー */
}

/*
 * main
 */

#define	STRING_LENGTH		127
#define	STRING_SIZE		(STRING_LENGTH+1)

int main ( void ) {
  char src[STRING_SIZE];
  char dst[STRING_SIZE] = "";

  printf ( "文字列を入力してください : " );
  scanf ( "%127s", src );

  printf ( "入力 : src = %s\n", src );
  printf ( "事前 : dst = %s\n", dst );

  str_copy ( src, dst );	/* 文字列のコピー */

  printf ( "事後 : dst = %s\n", dst );

  return 0;
}
入力例
123abc789
sample-014.c の実行結果
C:\usr\c\> sample-014
文字列を入力してください : 123abc789
入力 : src = 123abc789
事前 : dst = 
事後 : dst = 123abc789
C:\usr\c\> 

sample-015

Download : sample-015.c ( SJIS 版 )

sample-015.c
/*
 * 文字列の配列の表示 (関数版) [p.220, List 9-12]
 */

#include <stdio.h>

#define	STRING_SIZE	6

/*
 * put_sarray : 文字列の配列の表示
 */

void put_sarray ( char str_ary[][STRING_SIZE], int size ) {
  int i;

  for ( i = 0; i < size; i++ ) {
	printf ( "str_ary[%d] = \"%s\"\n", i, str_ary[i] );
  }
}

/*
 * main
 */

#define	ArraySizeOf(Ary)	(sizeof(Ary)/sizeof(Ary[0]))

int main ( void ) {
  char str_ary[][STRING_SIZE] = {
	"Turbo",
	"NA",
	"DOHC"
  };
  int i;

  put_sarray ( str_ary, ArraySizeOf(str_ary) );

  return 0;
}
sample-015.c の実行結果
C:\usr\c\> sample-015
str_ary[0] = "Turbo"
str_ary[1] = "NA"
str_ary[2] = "DOHC"
C:\usr\c\> 

sample-016

Download : sample-016.c ( SJIS 版 )

sample-016.c
/*
 * 大文字小文字の変換 [p.222, List 9-13]
 */

#include <stdio.h>
#include <ctype.h>

/*
 */

#define	EOS	'\0'

/*
 * str_toupper : 文字列内の小文字を大文字に変換する
 */

void str_toupper ( char str[] ) {
  unsigned int i;

  for ( i = 0; str[i] != EOS; i++ ) {
	str[i] = toupper ( str[i] );
  }
}

/*
 * str_tolower : 文字列内の大文字を小文字に変換する
 */

void str_tolower ( char str[] ) {
  unsigned int i;

  for ( i = 0; str[i] != EOS; i++ ) {
	str[i] = tolower ( str[i] );
  }
}

/*
 * main
 */

#define	STRING_LENGTH	100
#define	STRING_SIZE	(STRING_LENGTH+1)

int main ( void ) {
  char str [ STRING_SIZE ];

  printf ( "文字列を入力してください : " );
  scanf ( "%100s", str );

  str_toupper ( str );
  printf ( "大文字 : %s\n", str );

  str_tolower ( str );
  printf ( "小文字 : %s\n", str );

  return 0;
}
入力例
BohYoh
sample-016.c の実行結果
C:\usr\c\> sample-016
文字列を入力してください : BohYoh
大文字 : BOHYOH
小文字 : bohyoh
C:\usr\c\> 

sample-017

Download : sample-017.c ( SJIS 版 )

sample-017.c
/*
 * 大文字小文字の変換 [再帰版]
 */

#include <stdio.h>
#include <ctype.h>

/*
 */

#define	EOS	'\0'

/*
 * substr_toupper : 部分文字列内の小文字を大文字に変換する
 */

void substr_toupper ( char str[], int pos ) {

  if ( str[pos] != EOS ) {
	str[pos] = toupper ( str[pos] );
	substr_toupper ( str, pos + 1 );
  }
}

/*
 * str_toupper : 文字列内の小文字を大文字に変換する
 */

void str_toupper ( char str[] ) {
  substr_toupper ( str, 0 );
}

/*
 * substr_tolower : 後部分文字列内の大文字を小文字に変換する
 */

void substr_tolower ( char str[], int pos ) {

  if ( str[pos] != EOS ) {
	str[pos] = tolower ( str[pos] );
	substr_tolower ( str, pos + 1 );
  }
}

/*
 * str_tolower : 文字列内の大文字を小文字に変換する
 */

void str_tolower ( char str[] ) {
  substr_tolower ( str, 0 );
}

/*
 * main
 */

#define	STRING_LENGTH	100
#define	STRING_SIZE	(STRING_LENGTH+1)

int main ( void ) {
  char str [ STRING_SIZE ];

  printf ( "文字列を入力してください : " );
  scanf ( "%100s", str );

  str_toupper ( str );
  printf ( "大文字 : %s\n", str );

  str_tolower ( str );
  printf ( "小文字 : %s\n", str );

  return 0;
}
入力例
BohYoh
sample-017.c の実行結果
C:\usr\c\> sample-017
文字列を入力してください : BohYoh
大文字 : BOHYOH
小文字 : bohyoh
C:\usr\c\>