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有り版だとやり辛かったので素直にループ中でインクリメントするようにしました。