C語言:模擬實現字串函式strlen,strcpy,strcat,strcmp,strchr,strstr
什麼是C語言中的字串
字串或串(String)是由數字、字母、下劃線組成的一串字元。通常放在常量字串中或者字元陣列中。C語言中以 ‘\0’ 來作為字串的結束標記。
字元的ASCII編碼表
1.strlen
功能:字串求長
計算給定字串的(unsigned int型)長度,不包括 ‘\0’ 在內,引數指向的的字串必須以 ‘\0’ 結束,返回值為 size_t 無符號的。
用法:size_t strlen ( const char * str )
標頭檔案:string.h
模擬實現:
//非遞迴 int my_strlen1(const char *str) { int count = 0; while(*str != '\0') { count++; str++; } return count; } //遞迴 int my_strlen2(const char *str) { if (*str == '\0') { return 0; } else return 1 + my_strlen2(str + 1); }
執行結果:
char str[100] = {0};
printf("請輸入字串:");
scanf("%s",&str);
printf("字串長度為:%d\n",my_strlen1(str));
printf("字串長度為:%d\n",my_strlen2(str));
2.strcpy
功能:字串串複製
把源字串複製到目標空間。源字串必須以 ‘\0’ 結束,目標空間必須可變,src 和 dest 所指記憶體區域不可以重疊且 dest 必須有足夠的空間來容納 src 的字串。
用法:
char * strcpy ( char * destination, const char * source )
標頭檔案:string.h
模擬實現:
char *my_strcpy(char *dest, const char *src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++))
{
;
}
return ret;
}
執行結果:
char str1[] = "i im a boy"; char str2[100] = {0}; printf("src:%s\n",str1); printf("dest:%s\n",my_strcpy(str2, str1));
3.strcat
功能:字串連線
把兩個字串連線起來。源字串必須以 ‘\0’ 結束,目標空間必須可變。把 src 所指字串新增到 dest 結尾處(覆蓋 dest 結尾處的 ‘\0’ ), dest 必須有足夠的空間來容納 src 的字串
用法:
char * strcat ( char * destination, const char * source )
標頭檔案:string.h
模擬實現:
char *my_strcat(char *dest, const char *src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest != '\0')
{
dest++;
}
while((*dest++ = *src++))
{
;
}
return ret;
}
執行結果:
char str1[100] = "i im";
char str2[] = " a boy";
printf("%s\n",my_strcat(str1, str2));
4.strcmp
功能:字串比較
設這兩個字串為str1,str2,
看ASCII碼
若str1=str2,則返回零;
若str1<str2,則返回負數;
若str1>str2,則返回正數。
用法:int strcmp ( const char * str1, const char * str2 )
標頭檔案:string.h
模擬實現:
int my_strcmp(const char *str1, const char *str2)
{
int ret = 0;
assert(*str1 != NULL);
assert(*str2 != NULL);
while( ! (ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2)
{
str1++;
str2++;
}
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return (ret);
}
執行結果:
char *str1 = "abcde";
char *str2 = "abcde";
char *str3 = "abcef";
printf("%d\n",my_strcmp(str1, str2));
printf("%d\n",my_strcmp(str1, str3));
printf("%d\n",my_strcmp(str3, str2));
5.strchr
功能:查詢字串str中首次出現字元c的位置
返回首次出現c的位置的指標,返回的地址是被查詢字串指標開始的第一個與Val相同字元的指標,如果str中不存在c則返回NULL。
用法:
const char * strchr ( const char * str, int character )
char * strchr ( char * str, int character )
標頭檔案:string.h
模擬實現:
char *my_strchr(char *str, char c)
{
assert(str != NULL);
while(*str != '\0' && *str != c)
{
++str;
}
return *str == c ?str:NULL;
}
執行結果:
char *str = "abcdef";
printf("%s\n",my_strchr(str, 'c'));
6.strstr
功能:在字串中查詢
str1: 被查詢目標 string expression to search
str2: 要查詢物件 The string expression to find
返回值:若str2是str1的子串,則返回str2在str1的首次出現的地址;如果str2不是str1的子串,則返回NULL。
用法:
const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 )
標頭檔案:string.h
模擬實現:
char *my_strstr(const char *dest, const char *src)
{
assert(dest);
while (*dest)
{
while ((*dest != *src) && (*dest != 0))
dest++;
while (*dest == *src)
{
const char*pdest = dest;
const char*psrc = src;
while(*pdest == *psrc)
{
pdest++;
psrc++;
}
if (*psrc == 0)
return (char*)dest;
else
dest++;
}
}
return NULL;
}
執行結果:
char *str1 = "qwertyuiop";
char *str2 = "yui";
char *str3 = "ery";
printf("%s\n", my_strstr(str1, str2));
printf("%s\n", my_strstr(str1, str3));