文字列処理関数strlen、strcpy、strcat、strcmp、convertのC言語実装
本文は主にC言語で文字列処理における以下のいくつかの関数機能を実現した.
1)Mystrlenは文字列の長さを求めることを実現する
2)Mystrcpyによる文字列のコピー
3)Mystrcatは2つの文字列を接続する
4)Mystrcmpは2つの文字列サイズの比較を実現する
5)convertは小文字から大文字への変換を実現する
実装されるコードは次のとおりです.
strlenには次のような実装があります.
計算文字列の長さは再帰的に実現するが、文字列が長すぎる場合、再帰的に実現する計算文字列の長さは以下のような問題が発生する.関数呼び出しのオーバーヘッドがループよりずっと大きいため、オーバーヘッドが大きすぎます.2.再帰的な効率が低く、深さが大きすぎると、スタックオーバーフローなどのエラーが発生する可能性があります.
コードは次のとおりです.
方法1:
方法2:
1)Mystrlenは文字列の長さを求めることを実現する
2)Mystrcpyによる文字列のコピー
3)Mystrcatは2つの文字列を接続する
4)Mystrcmpは2つの文字列サイズの比較を実現する
5)convertは小文字から大文字への変換を実現する
実装されるコードは次のとおりです.
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
// Get the length of string
int Mystrlen(const char* src)
{
const char* p = src;
assert(src != NULL);
while(*(p++) != '\0');
return p - src - 1;
}
// Copy the source string to destination string
void Mystrcpy(char* dest, const char* src)
{
int i = 0;
assert(dest != NULL && src != NULL);
if(dest && src)
{
while((*(dest + i) = *(src + i)) != '\0')
i++;
*(dest + i) = '\0';
}
// return dest;
}
// concatenate the two string.
void Mystrcat(char *dest, const char *src)
{
assert(dest != NULL && src != NULL);
while(*(dest++) != '\0');
dest--;
while((*dest++ = *src++) != '\0');
}
// compare the two string
int Mystrcmp(const char *str1, const char *str2)
{
assert(str1 != NULL && str2 != NULL);
while(*str1 != '\0' && *str2 != '\0')
{
if(*str1 > *str2)
return 1;
else if(*str1 == *str2)
{
*str1++;
*str2++;
}
else
{
return -1;
}
}
if(*str1 != '\0')
return 1;
else if (*str2 != '\0')
return -1;
else
return 0;
}
// Convert the Low case to Upper case
void convert(char *str)
{
while(*str != '\0')
{
if(*str >= 'a' && *str <= 'z')
{
*str = *str + 'A' - 'a';
}
str++;
}
}
int main()
{
int i = 0;
char dest[20] = "hello,";
char *s = "world!";
char d[7];
int length;
length = Mystrlen(s);
printf("%d
", length);
Mystrcpy(d, s);
puts(s);
convert(d);
puts(d);
Mystrcat(dest, s);
puts(dest);
if(Mystrcmp(dest, s) == 1)
{
printf("dest great than s");
}
else if(Mystrcmp(dest, s) == -1)
{
printf("dest less than s");
}
else
{
printf("dest equal to s");
}
system("pause");
return 0;
}
strlenには次のような実装があります.
計算文字列の長さは再帰的に実現するが、文字列が長すぎる場合、再帰的に実現する計算文字列の長さは以下のような問題が発生する.関数呼び出しのオーバーヘッドがループよりずっと大きいため、オーバーヘッドが大きすぎます.2.再帰的な効率が低く、深さが大きすぎると、スタックオーバーフローなどのエラーが発生する可能性があります.
コードは次のとおりです.
方法1:
int my_strlen(const char* str)
{
assert(NULL != str);
if('\0' == *str)
{
return 0;
}
else
{
return (1 + my_strlen(++str));
}
}
方法2:
int my_strlen(const char* str)
{
assert(NULL != str);
return ('\0' != *str) ? (1 + my_strlen(++str)) : 0;
}