字符串函數

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'結尾。code

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碼的差值。ci

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'。字符串處理

相關文章
相關標籤/搜索