C語言-----string.h標頭檔案中相關字串函式的模擬實現
阿新 • • 發佈:2019-02-11
strlen:
用途:Get the length of a string.獲取字串長度。
函式原型:size_t strlen( const char *string ); size_t表示無符號的意思,長度值肯定是無符號的。- 源字串以'\0'作為結束標誌。
- strlen函式返回的是在字串中'\0'前面出現的字元個數(不包括'\0')
- 返回值是無符號的,不能作減法。
strcpy :用途:Copy a string.字串拷貝函式原型:char *strcpy( char *strDestination, const char *strSource );int my_strlen(const char *str) { int count = 0; assert(str != NULL); while (*str != '\0')//源串以'\0'位結束標誌,不是'\0'就一直進入迴圈 { count++; str++; } return count; } int main() { int ret = 0; char arr[] = "abcdef"; ret = my_strlen(arr); printf("%d\n", ret); system("pause"); return 0; }
- 會將'\0'拷貝到目標空間,目標空間必須足夠大,可以存放源字串
- 目標空間必須足夠大,可以存放源串
char* my_strcpy(char *dest, const char *src) { assert(dest != NULL); assert(src != NULL); char *ret = dest; while (*dest++ = *src++) { ; } return ret; } int main() { char arr[] = " "; char *ret = my_strcpy(arr, "hello world"); printf("%s\n", ret); system("pause"); return 0; }
strncpy:
長度受限制的字串拷貝。函式原型:char *strncpy( char *strDest, const char *strSource, size_t count );- 拷貝count個字元從源串到目標空間
- 如果源串的長度小於count,則拷貝完源串後再目標的後邊追加0,直到count個
模擬實現:
strcmp:char *my_strncpy(char *arr, char *str, int count) { assert(str); char *ret = arr; while (count--) { (*arr++) = (*str++); } *arr = '\0'; return ret; } int main() { char arr[] = " "; printf("%s\n", my_strncpy(arr, "abcdef",4)); system("pause"); return 0; }
用途:Compare strings.
函式原型:int strcmp( const char *string1, const char *string2 );- 如果string1大於string2,返回大於0的數字
- 如果string1等於string2,返回0
- 如果string1小於string2,返回小於0 的數字
int my_strcmp(const char *str1, const char *str2) { assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++; str2++; } if (*str1 < *str2) return -1; else if (*str1 > *str2) return 1; /*return *str1 - *str2;*/ } int main() { char *str1 = "aaaaaaaa"; char *str2 = "aaasdffg"; int ret = my_strcmp(str1, str2); printf("%d\n", ret); system("pause"); return 0; }strncmp:長度受限制的字串比較函式原型:int strncmp( const char *string1, const char *string2, size_t count );
- 比較到出現兩個字元不一樣或者一個字串結束或者count個字元全部比較完。
int my_strncmp(const char *str1, const char *str2, int count)
{
assert(str1);
assert(str2);
while (count--)
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
{
if (*str1 < *str2)
return -1;
else if (*str1 > *str2)
return 1;
}
}
return 0;
}
int main()
{
char *str1 = "aabcded";
char *str2 = "aadcdrfg";
printf("%d\n", my_strncmp(str1, str2, 4));
system("pause");
return 0;
}
strcat:
用途:Append a string.字串連線
函式原型:char *strcat( char *strDestination, const char *strSource );- 源字串以'\0'結束
- 目標空間必須足夠大,可以容納源串的內容。
- 目標空間必須可修改
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;
}
int main()
{
char arr[] = "abc";
printf("%s\n", my_strcat(arr, "defgh"));
system("pause");
return 0;
}
strchr:用途:Find a character in a string. 在字串str中查詢字元ch第一次出現的位置。函式原型:char *strchr( const char *string, int c );模擬實現:char* my_strchr(const char *str, int ch)
{
assert(str);
while (*str && (*str != (char)ch))
str++;
if (*str == (char)ch)
return (char *)str;
return NULL;
}
int main()
{
char *str = "abcdef";
printf("%s\n", my_strchr(str, 'a'));
system("pause");
return 0;
}
strrchr:用途:Scan a string for the last occurrence of a character.在string中查詢字元ch最後一個出現的位置函式原型:char *strrchr( const char *string, int c );模擬實現:char *my_strrchr(char *str, int ch)
{
assert(str);
while (*str++)
;
while (--str && (*str != (char)ch))
;
if (*str == (char)ch)
return (char *)str;
return NULL;
}
int main()
{
char *str = "abcdefasd";
printf("%s\n", my_strrchr(str, 'a'));
system("pause");
return 0;
}
strstr:用途:Find a substring.函式原型:char *strstr( const char *string, const char *strCharSet );模擬實現:
char* my_strstr(const char *str, const char * substr)
{
assert(str != NULL);
assert(substr != NULL);
while (*str != '\0')
{
const char *s1 = str;
const char *s2 = substr;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)str;
}
str++;
}
return NULL;
}
int main()
{
char *p = "abbbbcefd";
char *string = "bbc";
char *ret = my_strstr(p, string);
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
system("pause");
return 0;
}
strncat:用途:Append characters of a string.
函式原型:char *strncat( char *strDest, const char *strSource, size_t count );模擬實現:char *my_strncat(char *arr, char *str, int count)
{
assert(arr&&str);
char *ret = arr;
while (*arr != '\0')
arr++;
while (count--)
{
*arr++ = *str++;
}
*arr = '\0';
return ret;
}
int main()
{
char arr[] = "ab";
printf("%s\n", my_strncat(arr, "cdefgh", 4));
system("pause");
return 0;
}
接下來我們看一下string標頭檔案中幾個不太常見的函式:
- 返回第一個字串中第一個出現在第二個字串中的字元的地址。
- 測試一下:
int main()
{
char *p = "abcdef123hujkl";
char *p1 = "huhuhu1jij";
printf("%s\n", strpbrk(p, p1));
system("pause");
return 0;
}
- 結果:
- 返回的是string字串中開始部分匹配strCharSet字串中字元的個數。
- 測試一下:
int main()
{
char *p = "huhuabcdef123hujkl";
char *p1 = "huhuhu1jij";
printf("%d\n", strspn(p, p1));
system("pause");
return 0;
}
- 結果:
函式原型:size_t strcspn( const char *string, const char *strCharSet );
- 返回string中指向開始部分出現的不在strCharSet指向字串中字元的個數。
- 測試一下:
int main()
{
char *p = "bcdef123hujkl";
char *p1 = "huhuhu1jij";
printf("%d\n", strcspn(p, p1));
system("pause");
return 0;
}
- 結果: