文字列操作のライブラリを作ろう.
/* * my_string_operation.h */ #ifndef _MY_STRING_OPERATION_H_ #define _MY_STRING_OPERATION_H_ #include <stdio.h> // 標準入力などからの入力を文字列として受け取る // 第1引数:入力元.標準入力の際 |
/* * my_string_operation.c */ #include "my_string_operation.h" void mystr_inkey( FILE *fp, char *buff, int sz ){ ? fp から fgets して,改行文字をカットしたり,特定の長さ以上ならばエ ラー終了とする.なお,buff は sz 個の char のぶんだけメモリが確保さ れていることを前提にする. } |
文字列を先頭から1文字ずつ読み,検索キーとなる文字を検出すると,そ の位置を返す関数 mystr_find_char_in_string() を作ろう.もし見つからなければ,- 1 を返すことにする.my_string_operation のライブラリに追加しよう.以下 に C言語のソースファイルの例を示す.ヘッダファイルも適切に作成しよう.
// 第一引数の文字列の中から,第二引数の文字のみつかった最初の位置を返 // す.見付からないときは,-1 を返す. int mystr_find_char_in_string( char *str, char key ){ int i; i = 0; while( str[i] != ???? ){ // 終端文字 \0 になるまでループする. if( str[i] ???? ){ ???? // 見つかったので,場所を返す. } ???? // i 番目の文字は検査しおわったので,次の文字を検査するために... } return -1; // 見つからないとき } |
文字列の中に検索キーとなる文字列を検出すると,その位置を返す関数 mystr_find_str_in_string() を作ろう.もし見つからなければ,-1 を返すことにす る.my_string_operation のライブラリに追加しよう.実装は,strstr を使 う.
int mystr_find_str_in_string( char *str, char *key ){ char *p; p = strstr( str, key ); if( p == NULL ){ ???? // 見付からないとき } return p - str; } |
※ 最後の行の
動作確認をしよう.
/* list0401.c */ #include ?????? #define MAX 10 int main(){ char *s1, *key1, key2; int p1, p2; s1 = ???? malloc ???? 大きさMAXの文字列のメモリ確保 ?? おやくそく key1 = ??? malloc ???? 大きさMAXの文字列のメモリ確保 ?? おやくそく mystr_inkey( ???? s1 に文字列をキーボードから入力 ) mystr_inkey( ???? key1 に文字列をキーボードから入力 ) key2 = getchar(); printf("文字列全体:%s\n", s1); p1 = mystr_find_str_in_string( ??? s1 から key1 の場所を探す ) printf("%sは%d文字目から%d文字目\n", key1, p1, p1 + strlen(key1) - 1 ); p2 = mystr_find_char_in_string( ??? s1 から key2 の場所を探す ) printf("%cは%d文字目\n", key2, p2); return 0; // プリントでは抜けていました。 } |
文字列 s1 の後に文字列s2を結合するには,strcat( s1, s2 ); と実行すれ ば良い.ただし,s1 の文字列のメモリ領域に,s2 を含むことができるだけの 大きさが必要である.
しかし,strcat では,s2 の部分文字列を抽出して,結合することはできない.
文字列 s1 の後に文字列 s2 の p1 文字目から p2 文字目の手前までを結 合する関数mystr_strpcat( s1, s2, p1, p2 ) を作成しよう.s1 にメモリが 十分確保されていることを前提にしてよい.返り値はない.
たとえば,mystr_strpcat( s1, "abcdefghi", 2, 5 ) とすると,s1 の末 尾に "cde" が結合される.
void mystr_strpcat( char *s1, char *s2, int p1, int p2 ){ int i, k; i = 0; ? s1 の末尾'\0'を,i が指すようにする. for( k = p1; k ??? p2; i += 1, k += 1 ){ ? s1の i 番目に s2 の k 番目の文字を代入 } ? s1 に終端文字を追加する } |
なお,strncat を使って同等の動作をさせることができる.わかった人は, 上記の for 文を使うのではなく,strncat を使って実現しよう.
上記の課題を完遂し,次の表示がでるように,prac0401.c を補完せよ.
My name is Toridai Taro.
my_string_operation.h および my_string_operation.c を印刷し,手書 きでコメントを記入して提出せよ.
/* prac0401.c */ #include "my_string_operation.h" #define MSG "My name is " int main(){ char *s1, *s2; int p1, p2; s1 = "名前は「Toridai Taro」です."; p1 = ? Toridai Taro の先頭の文字 T の位置 p2 = ? Toridai Taro の末尾の文字 o の位置 + 1,すなわち,"」"の位置 s2 = (char *)malloc(sizeof(char) * (p2 - p1) + strlen( MSG ) + 1); strcat( s2, MSG); mystr_strpcat( s2, s1, p1, p2 ); strcat( s2, "."); printf("%s\n", s2); return 0; } |