原創作品,轉載請注明來源:http://www.cnblogs.com/shrimp-can/p/5643829.html
在使用由字符數組或指針組成的字符串的時候,要用到一些函數,這些函數通常包含在頭文件ctring中,以下是這個頭文件中的函數的解析。
一、拷貝相關函數:
memcpy:void* memcpy(void* destination,const void* source, size_t num)
從source指向的地址拷貝num bytes到destination指向的地址。不檢查source中的空字符,總是拷貝num bytes,可能產生溢出,當destination和source的大小小於num時。
memmove:void* memmove(void* destination,const void* source, size_t num)
從source指向的地址拷貝num bytes到destination指向的地址。常用於同一字符串的改變。不檢查source中的空字符,總是拷貝num bytes,可能產生溢出,當destination和source的大小小於num時。
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts(str);
輸出為:memmove can be very very useful.
strcpy:char * strcpy ( char * destination, const char * source )
將source指向的字符串拷貝到destination指向的地方。會檢查空字符,遇空字符停止(字符串結束標志)。可能存在溢出。
strncpy:char * strncpy ( char * destination, const char * source, size_t num )
將source指向的字符串拷貝到destination指向的地方,最多拷貝num bytes,或者遇到空字符(字符串結束標志)停止。num可以防止溢出。
二、連接相關函數:
strcat:char * strcat ( char * destination, const char * source )
將source指向的字符串連接到destination指向的字符串的后面。可能存在溢出,當連接后的大小大於destination的大小。
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
輸出為:these strings are concatenated.
strncat:char * strncat ( char * destination, const char * source, size_t num )
將source指向的字符串連接到destination指向的字符串的后面。最多連接num bytes。
三、比較相關函數:
memcmp:int memcmp ( const void * ptr1, const void * ptr2, size_t num )
比較ptr1、ptr2指向的內存塊的前面num bytes,如果都相同則返回0,如果第一個不同byte ptr1的小於ptr2的,返回負數,否則返回正數。如果前面都相同,即使中間遇到空字符,也會繼續比較下去,直到比較完所有的num bytes。
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
輸出為:'DWgaOtP12df0' is greater than 'DWGAOTP12DF0'.
strcmp:int strcmp ( const char * str1, const char * str2 );
比較str1、str2指向的字符串,直到遇到不相同的字符或者空字符結束。如果都相同則返回0,如果第一個不同byte ptr1的小於ptr2的,返回負數,否則返回正數。
strncmp:int strncmp ( const char * str1, const char * str2, size_t num )
比較ptr1、ptr2指向的字符串,直到遇到不相同的字符或者空字符結束或者比較完前面的num bytes結束。如果都相同則返回0,如果第一個不同byte ptr1的小於ptr2的,返回負數,否則返回正數。
strcoll:int strcoll ( const char * str1, const char * str2 )
比較str1、str2指向的字符串,直到遇到不相同的字符或者空字符結束。如果都相同則返回0,如果第一個不同byte ptr1的小於ptr2的,返回負數,否則返回正數。函數的行為決定於所選擇的c語言環境中的LC_CALLATE類別(用的比較少)
strxfrm:size_t strxfrm ( char * destination, const char * source, size_t num )
傳輸source指向的字符串到當前環境,然后拷貝前面num bytes字符到destination指向的地方,返回傳輸的字符串的長度,不包含空字符。函數的行為決定於所選擇的c語言環境中的LC_CALLATE類別(用的比較少)
四、檢索相關函數:
memchr:const void * memchr ( const void * ptr, int value, size_t num );
void * memchr ( void * ptr, int value, size_t num );
在ptr指向的內存中的前num bytes中搜索值value,返回第一個value的指針,如果沒有找到返回空指針。
char * pch;
char str[] = "Example string";
pch = (char*) memchr (str, 'p', strlen(str));
if (pch!=NULL)
printf ("'p' found at position %d.\n", pch-str+1);
else
printf ("'p' not found.\n");
輸出:'p' found at position 5.
strchr:const char * strchr ( const char * str, int character );
char * strchr ( char * str, int character );
在ptr指向的字符串中搜索值value,返回第一個value的指針,如果沒有找到返回空指針。
strcspn:size_t strcspn ( const char * str1, const char * str2 );
在str1指向的字符串中搜索str2指向的字符串中的任意一個字符,返回找到的第一個字符前面的字符數,如果沒有找到返回str1指向的字符串的字符數。
char str[] = "fcba73";
char keys[] = "1234567890";
int i;
i = strcspn (str,keys);
printf ("The first number in str is at position %d.\n",i+1);
輸出:The first number in str is at position 5
strpbrk:const char * strpbrk ( const char * str1, const char * str2 );
char * strpbrk ( char * str1, const char * str2 );
在str1指向的字符串中搜索str2指向的字符串中的任意一個字符,返回找到的第一個字符的指針,如果沒有找到返回空指針。
char str[] = "This is a sample string";
char key[] = "aeiou";
char * pch;
printf ("Vowels in '%s': ",str);
pch = strpbrk (str, key);
while (pch != NULL)
{
printf ("%c " , *pch);
pch = strpbrk (pch+1,key);
}
輸出:Vowels in 'This is a sample string': i i a a e i
strrchr:const char * strrchr ( const char * str, int character );
char * strrchr ( char * str, int character );
在ptr指向的字符串中搜索值character,返回最后一個character的指針,如果沒有找到返回字符串結束處的指針。
strspn:size_t strspn ( const char * str1, const char * str2 );
在str1指向的字符串中搜索str2指向的字符串中的任意字符,返回找到的字符個數。不包含空字符。
char strtext[] = "129th";
char cset[] = "1234567890";
i = strspn (strtext,cset);
printf ("The initial number has %d digits.\n",i);
輸出:The initial number has 3 digits.
strstr:const char * strstr ( const char * str1, const char * str2 );
char * strstr ( char * str1, const char * str2 );
在str1指向的字符串中查找str2指向的字符串,返回找到的第一次出現位置的指針,若沒找到,返回空指針。
strtok:char * strtok ( char * str, const char * delimiters );
將str指向的字符串進行划分,delimiters指向的字符串的任意字符都是一個分割點。第一次調用,起始位置為字符串的開始,后面的調用,用NULL指針來替代str,代表從上一次分割處開始。如果找到分割點,返回起始位置的指針,否則返回空指針。
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
輸出:
Splitting string "- This, a sample string." into tokens: This a sample string
五、其他函數
memset:void * memset ( void * ptr, int value, size_t num );
設置ptr指向的內存的前面num bytes的值為value
char str[] = "almost every programmer should know memset!";
memset (str,'-',6);
puts (str);
輸出:------ every programmer should know memset!
strerror:char * strerror ( int errnum );
將參數設置為erro,將返回描述錯誤的字符串
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
輸出:Error opening file unexist.ent: No such file or directory
strlen:size_t strlen ( const char * str );
返回str指向字符串的長度,不包含空字符
參考文獻:http://www.cplusplus.com/reference/cstring/