字串函式
- strlen()
- 介紹
- 作用
- 舉例使用strlen()函式
- 模擬實作strlen()函式
- strcpy()
- 介紹
- 作用
- 舉例使用strcpy()函式
- 模擬實作strcpy()函式
- strcpy()函式注意事項
- strncpy()函式
- 介紹
- 舉例使用strncpy()函式
- strcat()
- 介紹
- 作用
- 舉例使用strcat()函式
- 模擬實作strcat()函式
- strcat()函式注意事項
- strncat()函式
- 介紹
- 舉例使用strncat()函式
- strcmp()
- 介紹
- 作用
- 舉例使用strcmp()函式
- strncmp()函式
- strstr()
- 介紹
- 作用
- 舉例使用strstr()函式
- 模擬實作strstr()函式
- strtok()
- 介紹
- 作用
- 舉例使用strtok()函式
- 以下介紹的字串函式都是在<string.h>的頭檔案下的
strlen()
介紹
- 函式模型:size_t strlen( const char * string );
- 引數:一個字串
- 回傳值是size_t(unsigned int),無符號整數,因為字串長度不可能是負數,因此回傳值是一個無符號整數
作用
- 求字串的長度,并且在計數程序中遇到’\0’,就會停止計數,回傳’\0’之前的字符個數
舉例使用strlen()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "abcdefg";
printf("%u", strlen(str));
//因為strlen()函式回傳的是無符號整數,因此最正確的寫法是列印%u,%u是列印無符號整數,當然如果這里寫成%d也可以
return 0;
}
模擬實作strlen()函式
#include <stdio.h>
int my_strlen(const char* s)
{
char* p = s;
if (*p == '\0')//當遇到'\0'時,就停止計數
return 0;
return 1 + my_strlen(p + 1);
}
int main()
{
char str[] = "abcdefg";
int len = my_strlen(str);
printf("%d\n", len);
return 0;
}
strcpy()
介紹
- 函式模型:char * strcpy( char * str1, const char * str2 );
- 引數:目標字串和被拷貝字串
作用
- 字串拷貝,將字串str2的內容拷貝到字串str1中
舉例使用strcpy()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20];
char str2[] = "abcdef";
strcpy(str1, str2);//將字串str2的內容拷貝到字串str1中
printf("%s", str1);
return 0;
}
模擬實作strcpy()函式
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* str)
{
char* ret = dest;
assert(dest != NULL);
assert(str != NULL);
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "###############";
char arr2[] = "bits";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
strcpy()函式注意事項
- strcpy()函式在使用時,目標字串的空間必須足夠大(比被拷貝的字串空間大,因為strcpy是當遇到’\0’是才會停止拷貝),這樣才能正常使用,如果空間太小,就無法使用,因此在有些編譯器(比如VS)中會認為該函式不安全
- 但是在C語言的庫中,還有另一個字串拷貝函式----strncpy(),相比于strcpy()函式更安全
strncpy()函式
介紹
- 函式模型:char * strncpy( char * str1, const char * str2, size_t count );
- 相比于strcpy()函式,strncpy()函式多了一個引數,該引數是用來限定拷貝的長度的
舉例使用strncpy()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "################";
char str2[] = "abcdef";
strncpy(str1, str2, 2);
printf("%s", str1);
return 0;
}
- 運行結果

strcat()
介紹
- 函式模型:char * strcat( char * str1, const char * str2 );
作用
- 將字串str2追加到字串str1后面
舉例使用strcat()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcd";
char str2[] = "efg";
strcat(str1, str2);
printf("%s", str1);
return 0;
}
- 運行結果

模擬實作strcat()函式
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest,const char* src)
{
assert(dest && src);
char* p = dest;
//找到'\0'
while (*++dest)
{
;
}
//開始追加
while (*dest++ = *src++)
{
;
}
return p;
}
int main()
{
char arr1[20] = "abcd";
char arr2[] = "efg";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcat()函式注意事項
- 與strcpy()函式一樣,strcat()同樣存在不安全的情況,當strcat()追加自己時,就無法完成
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcd";
char str2[] = "efg";
strcat(str1, str1);
printf("%s", str1);
return 0;
}
上訴代碼無法完成對自己的追加
- 此時可以用strncat()函式
strncat()函式
介紹
- 函式模型:char * strncat( char * str1, const char * str2, size_t count );
- 相比于strcat()函式,多增加的引數是要追加的數量
舉例使用strncat()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str1[10] = "abcd";
strncat(str1, str1, 4);
printf("%s", str1);
return 0;
}
strcmp()
介紹
- 函式模型:int strcmp( const char * string1, const char * string2 );
作用
- 比較字串大小內容(不是長度)(參考字典序)(ASCII值),若string1>string2,回傳一個大于0的數,若string1=string2,回傳0,若string1 < string2,回傳小于0的數,
舉例使用strcmp()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcd";
char str2[] = "abce";
int ret = strcmp(str1, str2);
printf("%d", ret);
return 0;
}

strncmp()函式
- 同上面函式一樣,比strcmp()函式多了一個引數,比較的個數
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "abcd";
char str2[] = "abce";
int ret = strncmp(str1, str2, 3);
printf("%d", ret);
return 0;
}

strstr()
介紹
- 函式模型:char * strstr( const char * string, const char * strCharSet );
作用
- 字串查找函式,如果字串strCharSet在字串string中,回傳第一次出現的位置的指標,若不在string中,則回傳空指標
舉例使用strstr()函式
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "dhafjkhsdabcdrewtertwert";
char str2[] = "abc";
char* ret = strstr(str1, str2);
if (ret != NULL)
printf("%s\n", ret);
else
printf("找不到\n");
return 0;
}
- 運行結果

模擬實作strstr()函式
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
char* p1;
char* p2;
char* cp = str1;//記錄可能成功的值
while (*cp != '\0')
{
p1 = cp;
p2 = str2;
/*while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)*/
while (*p1 && *p2 && *p1 == *p2)
{
p1++;
p2++;
}
if (*p2 == '\0')
return cp;
if (*p1 == '\0')
return NULL;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "I am a good student, hehe";
char arr2[] = "student";
char* ret = my_strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
strtok()
介紹
- 函式模型:char * strtok( char * str, const char * strDelimit );
- strDelimit是分隔符字符集
作用
- strtok()是用來切割字串的
- 第一個引數指定一個字串,它包含了0個或多個由strDelimit字串中一個或多個分隔符分割的標記,
- strtok函式找到str中的下一個標記,并將其用’\0’結尾,回傳一個指向這個標記的指標(注:strtok函式會改變被操控的字串,所以在使用strtok函式切分的字串一般都是臨時拷貝的內容并且可修改,),
- strtok函式的第一個引數不為NULL,函式將找到str中的第一個標記,strtok函式將保存它在字串中的位置,
- strtok函式的第一個引數為NULL,函式將在同一個字串中被保存的位置開始,查找下一個標記,
舉例使用strtok()函式
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "15145j@qq.com";
char arr2[100] = { 0 };
strcpy(arr2, arr1);
char sep[] = "@.";
char* ret = NULL;
for (ret = strtok(arr2, sep);ret != NULL; ret = strtok(NULL, sep))
{
printf("%s\n", ret);
}
/*strtok(arr2, sep);
strtok(NULL, sep);*/
return 0;
}
- 運行結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/301808.html
標籤:其他
上一篇:記憶體函式的介紹
