文字列関数 strlen(), strcat(), strcpy(), strcmp() とメモリ操作関数 memset(), memcpy(), memcmp(), memmove() を C 言語で使用してコーディングし、 で始まる関数を実現するstr
, 操作オブジェクトは文字列で, mem で始まる関数はメモリ
1 です. strlen () 関数は '\0' を除く文字列の有効長
を求めます
. strlen () 関数の実現:
#include
#include
#include
size_t mystrlen( char *str)
{ assert (
ste != NULL);
const char*p = str;
size_t count = 0;
while(*p++ != '\0')
{
count++;
} return
count; 文字数を計算する size_t mystrlen(char *str) {
assert(str != NULL);
if(*str == '\0')
return 0;
else
return mystrlen(str+1)+1;
}
2. strcat() 文字列接続関数
strcat(s1, s2) put The文字列 s2 は s1 の後ろに接続されているため、関数
を実装するのに :
char *mystrcat(char *strD, const char *strS)
{
assert(strD!=NULL&&strS!=NULL);
char *pD = strD;
const char *pS = strS;
while(*pD != '\0')
{
pD++;
}
while(*pS != '\0')
{*pD++ = *pS++;}
*pD = ' \0';
return strD;
}
3. strcpy() 文字列コピー関数
strcpy (s1, s2) 文字列 s2 を s1 にコピー
char *mystrcpy(char *strD,const char *strS)
{
assert(strD != NULL&&strS !=NULL);
char *pD = strD;
const char *pS = strS ;
while (*pS !='\0')
{*pD++ = *pS++;}
*pD = '\0';
return strD;
}
4. strcmp() 文字列比較関数
int mystrcmp(const char *str1, const char *str2 )
{
assert(str1 != NULL&& str2 != NULL);
const char *pstr1 = str1;
const char *pstr2 = str2;
int result = 0;
while(*pstr != '\0'||*pstr2 != ' \0')
{
結果 = *pstr1 - *pstr2;
if(result != 0)
{break;}
pstr1++;
pstr2++;
}
if(result > 0)
result = 1;
else if(result < 0)
result = -1;
return result;
}
5. memset() メモリ設定 or initialize function
int array[10];
memset(array, 0, sizeof(int)*10);
0 で初期化された配列配列
void *mymemset(void *dest, int c, size_t count)
{
assert(dest != NULL);
char *p = (char *)dest;
while(count-- >0)
{*p++ = c;}
return dest;
}
6. memcpy() メモリコピー関数
メモリ コピー関数は、文字列をコピーできるだけでなく、strcpy() 関数と同様に、任意の型のオブジェクトをコピーできます
関数の 実装: 上書きを避ける
void *mymemcpy(void *dest,const void *src,size_t count)
{
assert(dest ! = NULL||src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pD>=pD||pD>=pS+count)
{
while ( count--)
{*pD++ = *pS++;}
}
else
{
while(count-- > 0)
{*(pD+count)=*(pS+count)}
}
return dest;
}
7. memcmp() メモリ比較関数
int mymemcmp(const void *buf1, const void *buf2, size_t count)
{
assert(buf1 != NULL || buf2 != NULL)
const char *pbuf1 = (const char *)buf1;
const char *pbuf2 = (const char *)buf2;
, 操作オブジェクトは文字列で, mem で始まる関数はメモリ
1 です. strlen () 関数は '\0' を除く文字列の有効長
を求めます
. strlen () 関数の実現:
#include
#include
#include
size_t mystrlen( char *str)
{ assert (
ste != NULL);
const char*p = str;
size_t count = 0;
while(*p++ != '\0')
{
count++;
} return
count; 文字数を計算する size_t mystrlen(char *str) {
assert(str != NULL);
if(*str == '\0')
return 0;
else
return mystrlen(str+1)+1;
}
2. strcat() 文字列接続関数
strcat(s1, s2) put The文字列 s2 は s1 の後ろに接続されているため、関数
を実装するのに :
char *mystrcat(char *strD, const char *strS)
{
assert(strD!=NULL&&strS!=NULL);
char *pD = strD;
const char *pS = strS;
while(*pD != '\0')
{
pD++;
}
while(*pS != '\0')
{*pD++ = *pS++;}
*pD = ' \0';
return strD;
}
3. strcpy() 文字列コピー関数
strcpy (s1, s2) 文字列 s2 を s1 にコピー
char *mystrcpy(char *strD,const char *strS)
{
assert(strD != NULL&&strS !=NULL);
char *pD = strD;
const char *pS = strS ;
while (*pS !='\0')
{*pD++ = *pS++;}
*pD = '\0';
return strD;
}
4. strcmp() 文字列比較関数
int mystrcmp(const char *str1, const char *str2 )
{
assert(str1 != NULL&& str2 != NULL);
const char *pstr1 = str1;
const char *pstr2 = str2;
int result = 0;
while(*pstr != '\0'||*pstr2 != ' \0')
{
結果 = *pstr1 - *pstr2;
if(result != 0)
{break;}
pstr1++;
pstr2++;
}
if(result > 0)
result = 1;
else if(result < 0)
result = -1;
return result;
}
5. memset() メモリ設定 or initialize function
int array[10];
memset(array, 0, sizeof(int)*10);
0 で初期化された配列配列
void *mymemset(void *dest, int c, size_t count)
{
assert(dest != NULL);
char *p = (char *)dest;
while(count-- >0)
{*p++ = c;}
return dest;
}
6. memcpy() メモリコピー関数
メモリ コピー関数は、文字列をコピーできるだけでなく、strcpy() 関数と同様に、任意の型のオブジェクトをコピーできます
関数の 実装: 上書きを避ける
void *mymemcpy(void *dest,const void *src,size_t count)
{
assert(dest ! = NULL||src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pD>=pD||pD>=pS+count)
{
while ( count--)
{*pD++ = *pS++;}
}
else
{
while(count-- > 0)
{*(pD+count)=*(pS+count)}
}
return dest;
}
7. memcmp() メモリ比較関数
int mymemcmp(const void *buf1, const void *buf2, size_t count)
{
assert(buf1 != NULL || buf2 != NULL)
const char *pbuf1 = (const char *)buf1;
const char *pbuf2 = (const char *)buf2;
int res = 0;
while(count-- > 0)
{
if((res = *pbuf++ - *pbuf2++)!=0)
{break;}
if(res> 0)
{res = 1;}
if(res < 0)
{res = - 1;}
reurn res;
}
}
8、memmove()内存移动関数
関数の実装
*mymemmove(void *dest,const void *src,size_t count)
{
assert(dest != NULL || src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pS >= pD||pD>=pS+count)
{
while(count-- >0)
{*pD++ = *pS++;}
}
else
{
while(count-- >0)
{*(pD+count)=*(pS+count);}
}
return dest;
}
while(count-- > 0)
{
if((res = *pbuf++ - *pbuf2++)!=0)
{break;}
if(res> 0)
{res = 1;}
if(res < 0)
{res = - 1;}
reurn res;
}
}
8、memmove()内存移动関数
関数の実装
*mymemmove(void *dest,const void *src,size_t count)
{
assert(dest != NULL || src != NULL);
char *pD = (char *)dest;
const char *pS = (const char*)src;
if(pS >= pD||pD>=pS+count)
{
while(count-- >0)
{*pD++ = *pS++;}
}
else
{
while(count-- >0)
{*(pD+count)=*(pS+count);}
}
return dest;
}