C语言string.h文件函数汇总详解
注:下列例程執行結果由VC++6.0環境編譯運行測試,確保驗證無誤。
目錄
- 一、常用函數
- 1.strcpy
- 2.strncpy
- 3.strstr
- 4.strcmp
- 5.strncmp
- 6.strchr
- 7.strlen
- 8.strcat
- 9.strncat
- 10.memcpy
- 11.memset
- 12.memcmp
- 二、不常用函數
- 1.strnset
- 2.strset
- 3.strtok
- 4.strupr
- 5.strlwr
- 6.strrchr
- 7.strtol
- 8.strtod
- 9.strrev
- 10.待續
一、常用函數
1.strcpy
函數原型:char *strcpy(char *destin, char *source);
函數功能:把含有’\0’結束符的字符串source(包含’\0’)復制到另一個地址空間destin。
使用例程:
#include<stdio.h> #include<string.h>int main(void) {char string[10]={0};char*str1="abcdefghi";strcpy(string,str1);printf("%s\n",string);return 0; }結果:
2.strncpy
函數原型:char *strncpy(char *dest, char *src,size_tn);
函數功能:將字符串src中最多n個字符復制到字符數組dest中(它并不像strcpy一樣遇到NULL才停止復制,而是等湊夠n個字符才停止復制),返回指向dest的指針。
使用例程:
#include<stdio.h> #include<string.h>int main(void) {char string[10]={0};char*str1="abcdefghi";strncpy(string,str1,3);printf("%s\n",string);return 0; }結果:
3.strstr
函數原型:char *strstr(char *str1, char *str2);
函數功能:找出str2字符串在str1字符串中第一次出現的位置(不包括str2的串結束符)
返回值: 返回該位置的指針,如找不到,返回空指針
使用例程:
結果:
4.strcmp
函數原型:int strcmp(char * str1,char * str2);
函數功能:比較兩個字符串str1,str2
返回值:str1<str2,返回負數;str1=str2,返回 0;str1>str2,返回正數
使用例程:
結果:
5.strncmp
函數原型:int strncmp(char *str1,char *str2,int count)
函數功能:對str1和str2中的前count個字符按字典順序比較
返回值:小于0:str1<str2,等于0:str1=str2,大于0:str1>str2
使用例程:
結果:
6.strchr
函數原型:char* strchr(char* str,char ch);
函數功能:找出str指向的字符串中第一次出現字符ch的位置
返回值:返回指向該位置的指針,如找不到,則返回空指針
使用例程:
結果:
7.strlen
函數原型:size_t strlen ( const char *s);
函數功能:計算字符串s的(unsigned int型)長度,不包括’\0’在內
返回值:s的長度,不包括’\0’在內
使用例程:
結果:
8.strcat
函數原型:char* strcat(char * str1,char * str2);
函數功能:把字符串str2接到str1后面,str1最后的’\0’被取消
使用例程:
#include<stdio.h> #include <string.h>int main(void) {char dest[5]="abcd";char *src="123456";strcat(dest, src);printf("dest= %s\n", dest);return 0; }結果:
注意點:
1)確保str1的大小足夠放下str2,否則會發生越界
2)str2會覆蓋str1的末尾‘\0’
3)str2會從str1的第一個‘\0’開始覆蓋
4)str2末尾需有’\0’
5)str2末尾的’\0’也會一同連接在str1后
6)該函數不一定是連接字符串,連接兩個普通的數組(非字符串),也是可行的,但依然需符合上述注意點。
下面的例程驗證(2) (3) (5)注意點:
#include <stdio.h> #include <string.h> #include <stdlib.h>int main(void) {char str1[10] = { "abcdefghi" };char str2[10] = { "111" };int i = 0;str1[4] = 0;strcat(str1,str2);printf("str1=%s\r\n",str1);for (i = 0; i < 10; i++){printf("%d ",str1[i]);}return 0; }結果:
9.strncat
函數原型:char *strncat(char *dest, const char *src, size_t maxlen)
函數功能:將字符串src中前maxlen個字符連接到dest中
使用例程:
結果:
10.memcpy
函數原型:void *memcpy(void *dest, const void *src, size_t n)
函數功能:內存拷貝
函數返回:指向dest的指針
使用例程:
#include<stdio.h> #include<string.h> int main() {char src[]="******************************";char dest[]="abcdefghijlkmnopqrstuvwxyz0123456709";char *ptr=NULL;printf("destination before memcpy:%s\n",dest);ptr=memcpy(dest,src,strlen(src));if (ptr)printf("destination after memcpy:%s\n",dest);elseprintf("memcpy failed");return 0; }結果:
11.memset
函數原型:void *memset(void *s, int c, size_t n)
函數功能:字符串中的n個字節內容設置為c
函數返回:指向dest的指針
使用例程:
#include<stdio.h> #include<string.h> int main() {char buffer[]="Hello world";printf("Buffer before memset:%s\n",buffer);memset(buffer,'*',strlen(buffer)-1);printf("Buffer after memset:%s\n",buffer);return 0; }結果:
12.memcmp
函數原型:int memcmp(const void *buf1, const void *buf2, size_t n);
函數功能:比較內存區域buf1和buf2的前n個字節。
函數返回:
如果返回值 < 0,則表示 str1 小于 str2。
如果返回值 > 0,則表示 str2 小于 str1。
如果返回值 = 0,則表示 str1 等于 str2。
二、不常用函數
1.strnset
函數原型:char *strnset(char *s, int ch, size_t n)
函數功能:將字符串s中前n個字符設置為ch的值
返回值:指向s的指針
使用例程:
結果:
2.strset
函數原型:char *strset(char *s, int ch)
函數功能:將字符串s中所有字符設置為ch的值
返回值:指向s的指針
使用例程:
3.strtok
函數原型:char *strtok(char *s1, const char *s2)
函數功能:分解s1字符串,用特定分隔符(s2)分隔成多個字符串
返回值:字符串s1中首次出現s2中的字符前的子字符串指針
strtok()在參數s1的字符串中發現參數s2中包涵的分割字符時,則會將該字符改為’\0’字符。在第一次調用時,strtok()必需給予參數s1字符串,往后的調用則將參數s1設置成 NULL。每次調用成功則返回指向被分割出片段的指針。
使用例程:
例程提示:
dest:ab 只打印了ab后面就沒打印了,是因為strtok(dest, ch); 使得dest數組內,ab后面的’,‘逗號被strtok函數換成了’\0’
說明:盡量使用可重入版的strtok,Windows平臺下為strtok_s,Linux平臺下為strtok_r。
牢記strtok函數族的分隔規則:忽略字符串前后的分隔符,連續的分隔符被當做一個處理。
在使用strtok前,請對源字符串進行備份,除非你可以接受字符串被修改這一事實(修改為分隔的第一個字符串)。
4.strupr
函數原型:char *strupr(char *s)
函數功能:將字符串s中的小寫字母變為大寫字母
使用例程:
int main() {char dest[]="ab,cd,EF,c";char* rp;rp=strupr(dest);printf("dest: %s, rp: %s", dest, rp);return 0; }結果:
注:原字符串dest 也被修改!!,對符號和大寫字符無影響。
5.strlwr
函數原型:char *strlwr(char *s)
函數功能:將字符串s中的大寫字母變為小寫字母
使用例程:
結果:
6.strrchr
函數原型:char *strrchr(const char *s, int c)
函數功能:得到字符串s中最后一個含有c字符的位置指針
返回值:位置指針
使用例程:
int main() {char dest[10]="abcdabc";char* rp;char ch= 'c';rp=strrchr(dest, ch);if(NULL == rp)printf("no %c exist", ch);elseprintf("pos of %c is %d", ch, (int)(rp-dest+1));return 0; }結果:
7.strtol
函數原型:long strtol(char *str, char **endptr, int base);
函數功能:將串轉換為長整型數
參數:
str是要轉換的字符
enptr是指向第一個不可轉換的字符位置的指針
base基數,范圍從2至36,或特殊值0。
返回值:轉換結果
注意點:
(1) 參數base代表采用的進制方式,如base值為10則采用10進制(字符串以10進制表示),若base值為16則采用16進制(字符串以16進制表示)。當base值為0時則默認采用10進制做轉換,但遇到 ‘0x’ / ‘0X’ 前置字符則會使用 16 進制轉換,遇到 ‘0’ 前置字符則會使用 8 進制轉換。
(2) 若endptr 不為NULL,則會將遇到的不符合條件而終止的字符指針由 endptr 傳回;若 endptr 為 NULL,則表示該參數無效,或不使用該參數。
函數執行流程:一開始strtol()會掃描參數str字符串,跳過前面的空格(只能跳空格,字母不行),直到遇上數字或正負符號才開始做轉換,再遇到非數字或字符串結束時(’\0’)結束轉換,并將結果返回。若參數endptr不為NULL,則會將遇到不合條件而終止的str中的字符指針由endptr返回;若參數endptr為NULL,則表示該參數無效,或不使用該參數。
示例1:
#include<stdlib.h> #include<stdio.h> int main(void) {char*str1="87654321";char*str2="-87654321";char*str3="+87654321";char*endptr;long lnumber;lnumber=strtol(str1,&endptr,10);printf("str1=%s\nlong=%ld\n",str1,lnumber);lnumber=strtol(str2,&endptr,10);printf("str2=%s\nlong=%ld\n",str2,lnumber);lnumber=strtol(str3,&endptr,10);printf("str3=%s\nlong=%ld\n",str3,lnumber);return 0; }運行結果:
該示例注意點:
(1) strtol函數支持正負數的轉換,可以在字符前加正負號也能順利轉換
示例2:
#include<stdlib.h> #include<stdio.h> void test1(void) {char str[] = " 2030300 This is test";char *ptr;long ret;ret = strtol(str, &ptr, 10);printf("數字(無符號長整數)是 %ld\n", ret);printf("字符串部分是 |%s|\n", ptr); } void test2(void) {char str[] = "abc2030300 This is test";char *ptr;long ret;ret = strtol(str, &ptr, 10);printf("數字(無符號長整數)是 %ld\n", ret);printf("字符串部分是 |%s|\n", ptr); } int main(void) {test1();test2();return 0; }運行結果:
該示例注意點:
1、strtol函數能跳過參數str字符串前面的空格,但不能跳過字母等,若字符串第一個不是數字而是字母,strtol函數無法轉換,且在endptr參數指針返回第一個不符合規則的字符。
2、若endptr 不為NULL,則會將遇到的不符合條件而終止的字符指針由 endptr 傳回,如test1函數中,ptr最終指向2030300后面的空格,打印字符串部分的時候也把空格打出來了。
3、類似test2函數這種情況,傳入的字符串一開始就是字母,strtol函數返回0。
示例3:
將字符串a, b, c 分別采用10, 2, 16進制轉換成數字
運行結果:
8.strtod
函數原型:double strtod(char *str, char **endptr);
函數功能:將字符串轉換為double型值
返回值:
示例:
#include<stdio.h> #include<stdlib.h> int main(void) {char* input="5.45",*endptr;double value;value=strtod(input,&endptr);printf("Thestringis%s\nthenumberis%lf\n",input,value);return 0; }結果:
9.strrev
函數原型: char *strrev(char *s)
函數功能: 將字符串中的所有字符顛倒次序排列
函數返回: 指向s的指針
示例:
#include<stdio.h> #include<string.h> int main(void) {char forward[]="string";printf("Before strrev():%s\n",forward);strrev(forward);printf("After strrev():%s\n",forward);return 0; }10.待續
總結
以上是生活随笔為你收集整理的C语言string.h文件函数汇总详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RT-Thread Pin设备驱动API
- 下一篇: RT-Thread uart串口设备驱动