C語言中string函數詳解

來源:互聯網
上載者:User
PS:本文包含了大部分strings函數的說明,並附帶舉例說明。本來想自己整理一下的,發現已經有前輩整理過了,就轉了過來。修改了原文一些源碼的問題,主要是用char *字義字串的問題,導致程式運行時崩潰。另外自己重寫了部分測試程式,使其更能滿足自己測試的需要。不當之處,還請海涵。@函數原型:  char *strdup(const char *s) 

函數功能:  字串拷貝,目的空間由該函數分配  

函數返回:  指向拷貝後的字串指標 

參數說明:  src-待拷貝的源字串 

所屬檔案:  <string.h>

#include <stdio.h> #include <string.h> #include <alloc.h> int main() {   char *dup_str, *string="abcde";   dup_str=strdup(string);   printf("%s", dup_str);   free(dup_str);   return 0; }

@函數名稱:  strcpy 

函數原型:  char* strcpy(char* str1,char* str2); 

函數功能:  把str2指向的字串拷貝到str1中去 

函數返回:  返回str1,即指向str1的指標 

參數說明: 

所屬檔案:  <string.h>

#include <stdio.h> #include <string.h> int main() {   char string[10];   char *str1="abcdefghi";   strcpy(string,str1);   printf("the string is:%s\n",string);   return 0; }

@函數名稱:  strncpy 

函數原型:  char *strncpy(char *dest, const char *src,intcount) 

函數功能:  將字串src中的count個字元拷貝到字串dest中去 

函數返回:  指向dest的指標 

參數說明:  dest-目的字串,src-源字串,count-拷貝的字元個數 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h> int main() {    char*src = "bbbbbbbbbbbbbbbbbbbb";//20 'b's   char dest[50] ="aaaaaaaaaaaaaaaaaaaa";//20 'a's    puts(dest);   strncpy(dest, src, 10);    puts(dest);     return0; }

 輸出:

/*******************************************aaaaaaaaaaaaaaaaaaaabbbbbbbbbbaaaaaaaaaa*******************************************/

注意:strncpy只複製指定長度的字元,不會自動在末尾加'\0'。若指定長度超過源字串長度,不夠的部分補‘\0’

@函數名稱:  strcat 

函數原型:  char* strcat(char * str1,char * str2); 

函數功能:  把字串str2接到str1後面,str1最後的'\0'被取消 

函數返回:  str1 

參數說明: 

所屬檔案:  <string.h>

#include <stdio.h> #include <string.h>int main() {   char buffer[80];  strcpy(buffer,"Hello ");   strcat(buffer,"world");   printf("%s\n",buffer);   return 0; }

 

@函數名稱:  strncat 

函數原型:  char *strncat(char *dest, const char *src, size_t maxlen) 

函數功能:  將字串src中前maxlen個字元串連到dest中 

函數返回: 

參數說明: 

所屬檔案:  <string.h>

#include <stdio.h> #include <string.h>char buffer[80];int main() {   strcpy(buffer,"Hello ");   strncat(buffer,"world",8);   printf("%s\n",buffer);   strncat(buffer,"*************",4);   printf("%s\n",buffer);   return 0; } 

注意:與strncpy不同的是,strncat會自動在末尾加‘\0’,若指定長度超過源字串長度,則只複製源字串長度即停止  

@函數名稱:  strcmp 

函數原型:  int strcmp(char * str1,char * str2); 

函數功能:  比較兩個字串str1,str2. 

函數返回:  str1<str2,返回負數;str1=str2,返回 0;str1>str2,返回正數.  

參數說明: 

所屬檔案:  <string.h>

#include <string.h> #include <stdio.h> int main() {   char *buf1="aaa", *buf2="bbb",*buf3="ccc";   int ptr;   ptr=strcmp(buf2, buf1);   if(ptr>0)     printf("buffer 2 is greater thanbuffer 1\n");   else     printf("buffer 2 is less thanbuffer 1\n");   ptr=strcmp(buf2, buf3);   if(ptr>0)     printf("buffer 2 is greater thanbuffer 3\n");   else     printf("buffer 2 is less thanbuffer 3\n");   return 0; }

@函數名稱:  strncmp 

函數原型:  int strncmp(char *str1,char *str2,int count) 

函數功能:  對str1和str2中的前count個字元按字典順序比較 

函數返回:  小於0:str1<str2,等於0:str1=str2,大於0:str1>str2 

參數說明:  str1,str2-待比較的字串,count-比較的長度 

所屬檔案:  <string.h>

#include<string.h> #include<stdio.h> int main() {    char str1[] ="aabbc";//   char str2[] = "abbcd";//   //為使測試程式更簡練,此處假定了strncmp只返回-1,0,1三個數   char res_info[] = {'<','=','>'};   int res;    //前1個字元比較   res = strncmp(str1, str2, 1);   printf("1:str1%c str2\n", res_info[res+1]);      //前3個字元比較   res = strncmp(str1, str2, 3);   printf("3:str1%c str2\n", res_info[res+1]);}

輸出:

/****************************************1:str1= str23:str1< str2*****************************************/

@函數名稱:  strpbrk 

函數原型:  char *strpbrk(const char *s1, const char *s2) 

函數功能:  得到s1中第一個“同時也出現在s2中”字元的位置指標 

函數返回:  位置指標 

參數說明: 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h> int main() {    char *p="Find all vowels";    p=strpbrk(p+1,"aeiouAEIOU");   while(p)   {      printf("%s\n",p);      p=strpbrk(p+1,"aeiouAEIOU");        }return 0; }

輸出:

/**************************************ind all vowelsall vowelsowelsels**************************************/

@函數名稱:  strcspn 

函數原型:  int strcspn(const char *s1, const char *s2) 

函數功能:  統計s1中從頭開始直到第一個“來自s2中的字元”出現的長度 

函數返回:  長度 

參數說明: 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h>int main() {  printf("%d\n",strcspn("abcbcadef","cba"));  printf("%d\n",strcspn("xxxbcadef","cba"));  printf("%d\n",strcspn("123456789","cba"));   return 0; }

輸出:

/************************039************************/

@函數名稱:  strspn 

函數原型:  int strspn(const char *s1, const char *s2) 

函數功能:  統計s1中從頭開始直到第一個“不來自s2中的字元”出現的長度 

函數返回:  位置指標 

參數說明: 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h> #include<alloc.h> int main() {    printf("%d\n",strspn("abcbcadef","cba"));   printf("%d\n",strspn("xxxbcadef","cba"));   printf("%d\n",strspn("123456789","cba"));   return 0; }

 輸出:

/************************600************************/

 

@函數名稱:  strchr 

函數原型:  char* strchr(char* str,char ch); 

函數功能:  找出str指向的字串中第一次出現字元ch的位置 

函數返回:  返回指向該位置的指標,如找不到,則返回null 指標 

參數說明:  str-待搜尋的字串,ch-尋找的字元 

所屬檔案:  <string.h>

#include<string.h> #include<stdio.h> int main() {    char *str = "This is a string!";   char ch;   char *p;    while(1)   {      printf("Please input a char:");      ch = getchar();      p = strchr(str, ch);      if(p)         printf("%c is the %d character of\"%s\"\n",ch, (int)(p-str+1),str);      else         printf("Not found!\n");       printf("Press ESC to quit!\n\n");      if(27 == getch())         break;      fflush(stdin);   }   return 0; }

運行結果:

/********************************************Please input achar:ii is the 3character of "This is a string!"Press ESC to quit! Please input achar:lNot found!Press ESC to quit! Please input achar:ss is the 4character of "This is a string!"Press ESC to quit!**********************************************/

@函數名稱:  strrchr 

函數原型:  char *strrchr(const char *s, int c) 

函數功能:  得到字串s中最後一個含有c字元的位置指標 

函數返回:  位置指標 

參數說明: 

所屬檔案:  <string.h>

#include<string.h> #include<stdio.h> int main() {   charstring[15];   char*ptr,c='r';  strcpy(string,"This is a string");  ptr=strrchr(string,c);   if (ptr)    printf("The character %c is at position:%d",c,ptr-string);   else    printf("The character was not found");   return 0; }

 

@函數名稱:  strstr 

函數原型:  char* strstr(char* str1,char* str2); 

函數功能:  找出str2字串在str1字串中第一次出現的位置(不包括str2的串結束符) 

函數返回:  返回該位置的指標,如找不到,返回null 指標 

參數說明: 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h> int main() {   char*str1="Open Watcom C/C++",*str2="Watcom",*ptr;  ptr=strstr(str1,str2);  printf("The substring is:%s\n",ptr);   return 0; }

輸出:

  The substringis:Watcom C/C++

@函數名稱:  strrev 

 函數原型:  char *strrev(char *s) 

函數功能:  將字串中的所有字元顛倒次序排列 

函數返回:  指向s的指標  

參數說明: 

所屬檔案:  <string.h>

#include<string.h> #include<stdio.h> int main() {   char forward[]="string"; //原文中定義為char*是不對的,指向程式碼片段的指標內容是不可變的 printf("Before strrev():%s",forward);  strrev(forward);   printf("Afterstrrev(): %s",forward);   return 0; }

輸出:

/************************************Beforestrrev():stringAfter strrev():gnirts************************************/

 

@函數名稱:  strnset 

函數原型:  char *strnset(char *s, int ch, size_t n) 

函數功能:  將字串s中前n個字元設定為ch的值 

函數返回:  指向s的指標 

參數說明: 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h> int main() {    charstring[]="aaaaaaaaaaaaaaaaaaaaaaa";   char letter='x';   printf("string before strnset:%s\n",string);   strnset(string,letter,10);   printf("string after strnset:  %s\n",string); return 0; }

輸出:

/*************************************************string beforestrnset: aaaaaaaaaaaaaaaaaaaaaaastring afterstrnset:  xxxxxxxxxxaaaaaaaaaaaaa*************************************************/

 

@函數名稱:  strset 

函數原型:  char *strset(char *s, int ch) 

函數功能:  將字串s中所有字元設定為ch的值 

函數返回:  指向s的指標  

參數說明: 

所屬檔案:  <string.h>

#include<stdio.h> #include<string.h> int main() {   charstring[10]="123456789";   charsymbol='c';  printf("Before strset(): %s", string);  strset(string, symbol);  printf("After strset(): %s", string);   return 0; }

@函數名稱:  strtok 

函數原型:  char *strtok(char *s1, const char *s2) 

函數功能:  分解s1字串為用特定分隔字元分隔的多個字串(一般用於將英文句分解為單詞) 

函數返回:  字串s1中首次出現s2中的字元前的子字串指標 

參數說明:  s2一般設定為s1中的分隔字元 

        規定進行子調用時(即分割s1的第二、三及後續子串)第一參數必須是NULL 

        在每一次匹配成功後,將s1中分割出的子串位置替換為NULL(摘下鏈中第一個環),因此s1被破壞了 

        函數會記憶指標位置以供下一次調用 

         

所屬檔案:  <string.h>

#include<string.h> #include<stdio.h> int main() {   char *p;   char*buffer;   char*delims={ " .," }; buffer=strdup("Find words, all of them.");  printf("%s\n",buffer);  p=strtok(buffer,delims);  while(p!=NULL){    printf("word: %s\n",p);    p=strtok(NULL,delims);   }  printf("%s\n",buffer);   return 0; }//根據測試,可以隨時給strtok的第一個參數輸入一個新的字串,開始新字串的分隔

PS:根據測試,可以隨時給strtok的第一個參數輸入一個新的字串,開始新字串的分隔


@函數名稱:  strupr 

函數原型:  char *strupr(char *s) 

函數功能:  將字串s中的字元變為大寫 

函數返回: 

參數說明: 

所屬檔案:  <string.h>

#include <stdio.h> #include <string.h> int main() {   char string[]="abcdefghijklmnopqrstuvwxyz",*ptr; //會影響原字串的記憶體,用char[]來聲明  ptr=strupr(string);   printf("%s",ptr);   return 0; }

 

@函數名稱:  strlwr 

函數原型:  char *strlwr(char *s) 

函數功能:  將字串中的字元變為小寫字元 

函數返回:  指向s的指標 

參數說明: 

所屬檔案:  <string.h>

#include<string.h> int main() {   char str[]="HOW TO SAY?";   printf("%s",strlwr(str));   return 0; }

 

@函數名稱:  strerror 

函數原型:  char *strerror(int errnum) 

函數功能:  得到錯誤資訊的內容資訊 

 函數返回:  錯誤提示資訊字串指標 

參數說明:  errnum-錯誤編號 

所屬檔案:  <string.h>

#include <stdio.h> #include <errno.h> int main() {   char *buffer;   buffer=strerror(errno);   printf("Error: %s",buffer);   return 0; }

@函數名稱:  memcpy 

函數原型:  void *memcpy(void *dest, const void *src, size_t n) 

函數功能:  字串拷貝 

函數返回:  指向dest的指標 

參數說明:  src-源字串,n-拷貝的最大長度 

所屬檔案:  <string.h>,<mem.h>

#include <stdio.h> #include <string.h> int main() {   char src[]="******************************";   char dest[]="abcdefghijlkmnopqrstuvwxyz0123456709";   char *ptr;   printf("destination before memcpy:%s\n",dest);   ptr=memcpy(dest,src,strlen(src));   if (ptr)     printf("destination after memcpy:%s\n",dest);   else     printf("memcpy failed");   return 0; }

輸出:

/*************************************************************destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123456709destination after memcpy:******************************456709**************************************************************/

@函數名稱:  memccpy 

函數原型:  void *memccpy(void *dest, const void *src, int c, size_t n) 

函數功能:  字串拷貝,到指定長度或遇到指定字元時停止拷貝 

函數返回: 

參數說明:  src-源字串指標,c-中止拷貝檢查字元,n-長度,dest-拷貝底目的字串指標 

所屬檔案:  <string.h>,<mem.h>

#include <string.h> #include <stdio.h> int main() {   char *src="This is the source string";   char dest[50];   char *ptr;   ptr=memccpy(dest,src,'c',strlen(src));   if (ptr)   {     *ptr='\0';     printf("The character wasfound:%s",dest);   }   else     printf("The character wasn'tfound");   return 0; }

輸出:

/*****************************************The character was found:This is the sourc*****************************************/

PS:指定字元被複製到dest中,memccpy返回了dest中指定字元的下一處的地址,返回NULL表示未遇到指定字元

@函數名稱:  memchr 

函數原型:  void *memchr(const void *s, int c, size_t n) 

函數功能:  在字串中第開始n個字元中尋找某個字元c的位置 

函數返回:  返回c的位置指標,返回NULL時表示未找到 

參數說明:  s-要搜尋的字串,c-要尋找的字元,n-指定長度 

所屬檔案:  <string.h>,<mem.h>

#include <string.h> #include <stdio.h> int main() {   char str[17];   char *ptr;   strcpy(str,"This is a string");   ptr=memchr(str,'r',strlen(str));   if (ptr)   printf("The character 'r' is at position:%d",ptr-str);   else   printf("The character was not found");   return 0; }

 

@函數名稱:  memcmp 

函數原型:  int memcmp(const void *s1, const void *s2,size_t n) 

函數功能:  按字典順序比較兩個串s1和s2的前n個位元組  

函數返回:  <0,=0,>0分別表示s1<,=,>s2 

參數說明:  s1,s2-要比較的字串,n-比較的長度 

所屬檔案:  <string.h>,<mem.h>

#include <stdio.h> #include <string.h> int main()  {    char *buf1="ABCDE123";    char *buf2="abcde456";    int stat;    stat=memcmp(buf1,buf2,5);    printf("The strings to position 5 are");    if(stat) printf("not ");    printf("the same\n");    return 0;  } 

@函數名稱:  memicmp 

函數原型:  int memicmp(const void *s1, const void *s2, size_t n) 

函數功能:  按字典順序、不考慮字母大小寫對字串s1,s2前n個字元比較 

函數返回:  <0,=0,>0分別表示s1<,=,>s2 

參數說明:  s1,s2-要比較的字串,n-比較的長度 

所屬檔案:  <string.h>,<mem.h>

#include <stdio.h> #include <string.h> int main() {   char *buf1="ABCDE123";   char *buf2="abcde456";   int stat;   stat=memicmp(buf1,buf2,5);   printf("The strings to position 5 are");   if(stat) printf("not");   printf("the same");   return 0; }

輸出:

/**************************************The strings to position 5 are the same***************************************/

 

@函數名稱:  memmove 

函數原型:  void *memmove(void *dest, const void *src, size_t n) 

函數功能:  字串拷貝 

函數返回:  指向dest的指標 

參數說明:  src-源字串,n-拷貝的最大長度 

所屬檔案:  <string.h>,<mem.h>

#include <string.h> #include <stdio.h> int main() {   chardest[40]="abcdefghijklmnopqrstuvwxyz0123456789";   printf("destination prior tomemmove:%s\n",dest);   memmove(dest+1,dest,35);   printf("destination aftermemmove:%s",dest);   return 0; }

PS:與memcpy不同的是,memmove可以處理目的字串與源字串地址空間出現重疊的情況,可保證待覆制的內容不被破壞。

@函數名稱:   memset

函數原型:   void *memset(void *s, int c, size_t n)

函數功能:   字串中的n個位元組內容設定為c

函數返回:

參數說明:   s-要設定的字串,c-設定的內容,n-長度

所屬檔案:   <string.h>,<mem.h>

#include <string.h>#include <stdio.h>#include <mem.h>int main(){  charbuffer[]="Hello world"; printf("Buffer before memset:%s/n",buffer); memset(buffer,'*',strlen(buffer)-1); printf("Buffer after memset:%s",buffer);  return 0;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.