strncpy、strncat、strncmpを自作する
K&R本 演習5-5
その引数である文字列の最初の最大 n 文字を扱うライブラリ関数strncpy、strncat、strncmpを書け。例えば、strncpy(s,t,n)はtの最大n文字をsにコピーするものにせよ。
まずはstrncpy関数
#include <stdio.h> char *mystrncpy(char *s,char *t,int n) { char *p = s; while ( *t && n-- ) { *s++ = *t++; } *s = '\0'; return p; } int main (void) { char str[] = "aaaaaaaa"; printf("%s\n",mystrncpy(str,"ab",3)); printf("%s\n",mystrncpy(str,"abced",3)); printf("%s\n",mystrncpy(str,"abced",6)); return 0; }
$ main ab abc abced
次はstrncat関数
#include <stdio.h> #include <string.h> char *mystrncat(char *s,char *t,int n) { char *p = s; s += strlen(s); while( *t && n-- ) { *s++ = *t++; } *s = '\0'; return p; } int main (void) { char str[][10] = { "oop", "oop", "oop", }; printf("%s\n",mystrncat(str[0],"ab",3)); printf("%s\n",mystrncat(str[1],"abced",3)); printf("%s\n",mystrncat(str[2],"abced",6)); return 0; }
$ main oopab oopabc oopabced
最後はstrncmp関数
#include <stdio.h> int mystrncmp(char *s,char *t,int n) { while( *s == *t ) { if ( *s == '\0' || !--n ) { return 0; } *s++; *t++; } return *s - *t; } int main (void) { char str[] = "abc"; printf("%d\n",mystrncmp(str,"ab",3)); printf("%d\n",mystrncmp(str,"abc",3)); printf("%d\n",mystrncmp(str,"abced",3)); printf("%d\n",mystrncmp(str,"abced",6)); return 0; }
$ main 99 0 0 -101
完成です。n無し版だとwhileの条件式でインクリメントするのが定石でしたが、n有り版だとやり辛かったので素直にループ中でインクリメントするようにしました。