strstr
函式功能:在一字串中查找指定的字串)
頭 文 件: #include <string.h>
定義函式: char *strstr(const char *haystack, const char * needle);
引數分析:haystack --> 需要搜查的字串 (被動 家里)
needle --> 需要查找的內容 (主動 毒品)
返 回 值:成功 回傳指定字串第一次出現的地址 失敗 回傳 0
char str1[] = "Hello Even&GZ2075";
char *str2;
str2 = strstr(str1, "ven");
printf("%s\n", str3);
輸出:ven&GZ2075
strlen
函式功能:回傳字串長度,不包括'\0'
頭 文 件: #include <string.h>
定義函式: size_t strlen (const char *s);
引數分析:s --> 需要求長度的字串,不包括結束字符"\0"
返 回 值:回傳字串 s 的字符數
printf("%ld\n", strlen("ven&GZ2075"));
輸出:10
strtok
函式功能:分割字串
頭 文 件:#include <string.h>
定義函式:char * strtok(char *s, const char *delim);
引數分析:s --> 需要分割的字串 delim --> 分割字符(用什么符號作為分割標記)可以有多個字符
返 回 值:成功 回傳下一個分割后的字串指標 如果已無從分割則回傳 NULL
strcat,strncat
函式功能:連接兩字串,推薦使用strncat可以控制拼接的長度,避免越界/非法訪問,
頭 文 件: #include <string.h>
定義函式: char *strcat (char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
引數分析:dest --> 目標地址 src --> 需要拷貝的字串 n --> 期望連接的長度
返 回 值:回傳引數 dest 的字串起始地址
char str[8] = "Hello" ;//指標STR 指向資料段中的常量區
char * p ="GZ2075";
strncat(str , p , sizeof(str)-strlen(str)-1); //可以使用 = 陣列大小-實際已經使用的-1,-1是為了存'\0'
printf("%s\n" , str);
輸出:HelloGZ
注意:
無論如何字串的末尾都應該以'\0'結尾,
strcpy / strncpy
函式功能:拷貝字串
頭 文 件:#include <string.h>
定義函式:char *strcpy(char *dest, const char *src);
char * strncpy(char *dest, const char *src, size_t n);
引數分析:dest --> 目標地址 src --> 需要拷貝的字串的路徑 n --> 期望拷貝的數大小
返 回 值:成功 回傳引數 dest 的字串起始地址
char str[32] = "Hello&Even&GZ2075" ; // 指標STR 指向資料段中的常量區
char * str_1 = calloc( 1 , 32 );
//str_1="Hello&Even&GZ2075"; // 錯誤,語法沒問題,但是邏輯上不對,當前改變了STR1的指向 堆記憶體的入口地址被你搞丟了
strncpy(str_1,"Hello&Even&GZ2075",32 );//把"Hello&Even&GZ2075" 拷貝到str_1中(堆空間)
printf("str_1:%s\n" , str_1);
char * p = "GZ2075";
bzero(str, sizeof(str));
printf("str:%s\n" , str);
strcpy(str_1 , p); // 不會檢查記憶體空間大小
printf("str:%s\n" , str_1);
// strncpy(str_1 , p , 32 ); // 控制拷貝的資料大小,在安全范圍內
printf("str+8:%s\n",str_1+8);//發現strcpy純粹覆寫內容并沒有清空,strlen + 1 --> 跳過GZ2075 + 結束符
輸出:
str_1:Hello&Even&GZ2075
str:
str:GZ2075
str+8:en&GZ2075
strcmp
函式功能:字串比較,strncmp會順便清空后面的內容,加入實際資料只有8位元組而n是32,則會把8位元組后的資料清空為 0
頭 文 件:#include <string.h>
定義函式:int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
引數分析:s1 --> 需要比較的字串1 s2 --> 需要比較的字串1 n --> 需要比較的前N個字符
返 回 值:回傳 0 表示兩個字串相等, 回傳 非零 表示兩個字串不同,回傳值為第一個不同首字母的ASCII碼的差值,
char *str1 = "AAAAA";
char *str12 = "AAA";
int result = strcmp(str1, str2); //注意是str1-str2,傳入引數與順序有關
printf("result = %d\n", result);
printf("result = %c\n", result); //回傳不同的第一個字母在ascii上的差值,
輸出:
65
A
strchr
函式功能:查找字串中第一個出現的指定字符
頭 文 件: #include <string.h>
定義函式: char * strchr (const char *s, int c); // 從左往右
char * strrchr (const char *s, int c); // 從右往左
引數分析: s --> 需要查找的字串 c --> 需要查找的字符(unsigned char )
返 回 值: 成功 回傳第一次出現的位置的地址 失敗 回傳 0
char p1[] = "Hello&Even";
char * ret_val = strchr(p1 , 'e'); // 從左往右尋找
printf("RetVal :%s \n" , ret_val);
ret_val = strrchr(p1 , 'e'); // 從左往右尋找
printf("RetVal :%s \n" , ret_val);
輸出:
RetVal :ello&Even
RetVal :en
注意
1.字串函式傳入的引數最好用字符陣列定義,因為有些字串處理函式,不允許傳入字符指標;
2.字串函式回傳地址,應該用字符指標接收;
3.處理字串時,要注意結尾是否加上了'\0',定義的字符陣列的大小也應該能夠容納結束符'\0',
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230591.html
標籤:C
