轉自 http://www.cnblogs.com/xiangzi888/archive/2012/04/16/2451947.html
平時對字符串的操作的是很多的,瞭解下常用的字符串函數會使 c 編程變得很快捷!這裏適當整理一下,方便以後參考。使用時,會用到大量指針的操作,注意加頭文件:
#include <string.h>
一、str 系列
1.strtok
extern char *strtok( char *s, const char *delim );
功能:分解字符串爲一組標記串。s爲要分解的字符串,delim爲分隔符字符串。
說明:strtok()用來將字符串分割成一個個片段。當strtok()在參數s的字符串中發現到參數delim的分割字符時則會將該字符改爲 \0 字符。在第一次調用時,strtok()必需給予參數s字符串,往後的調用則將參數s設置成NULL。每次調用成功則返回被分割出片段的指針。當沒有被分割的串時則返回NULL。所有delim中包含的字符都會被濾掉,並將被濾掉的地方設爲一處分割的節點。
舉例:
複製代碼
/* strtok example */
#include <stdio.h>
#include <string.h>
int main (void)
{
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, " ,.-");
}
printf("at the end: %s", str);
return 0;
}
複製代碼
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
the end: - This
注:strtok函數會破壞被分解字符串的完整,調用前和調用後的s已經不一樣了。另外貌似製表符 \t 無法充當分割字符。
2.strstr
char * strstr( const char * str1, const char * str2 );
功能:從字符串 str1 中尋找 str2 第一次出現的位置(不比較結束符NULL),如果沒找到則返回NULL。
舉例:
複製代碼
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "This is a simple string";
char *pch;
pch = strstr(str, "simple");
strncpy(pch, "sample", 6);
puts(pch);
puts(str);
return 0;
}
複製代碼
sample string
This is a sample string
3.strchr
char * strchr ( const char *str, int ch );
功能:查找字符串 str 中首次出現字符 ch 的位置
說明:返回首次出現 ch 的位置的指針,如果 str 中不存在 ch 則返回NULL。
舉例:
複製代碼
/* strchr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "This is a simple string";
char *pch;
printf("Looking for the 's' character in \"%s\"...\n", str);
pch = strchr(str, 's');
while (pch != NULL){
printf("found at %d th\n", pch - str + 1);
pch = strchr(pch + 1, 's');
}
return 0;
}
複製代碼
Looking for the 's' character in "This is a simple string"...
found at 4 th
found at 7 th
found at 11 th
found at 18 th
4.strcpy
char * strcpy( char * dest, const char * src );
功能:把 src 所指由NULL結束的字符串複製到 dest 所指的數組中。
說明:src 和 dest 所指內存區域不可以重疊且 dest 必須有足夠的空間來容納 src 的字符串。返回指向 dest 結尾處字符(NULL)的指針。
類似的:
strncpy
char * strncpy( char * dest, const char * src, size_t num );
stpcpy
非庫函數,用法跟 strcpy 完全一樣
5.strcat
char * strcat ( char * dest, const char * src );
功能:把 src 所指字符串添加到 dest 結尾處(覆蓋dest結尾處的’\0’)並添加’\0’。
說明:src 和 dest 所指內存區域不可以重疊且 dest 必須有足夠的空間來容納 src 的字符串。
返回指向 dest 的指針。
類似的 strncat
char * strncat ( char * dest, const char * src, size_t num );
6.strcmp
int strcmp ( const char * str1, const char * str2 );
功能:比較字符串 str1 和 str2。
說明:
當s1
int strncmp ( const char * str1, const char * str2, size_t num );
strcasecmp
extern int strcasecmp(const char *str1, const char *str2);
strncasecmp
extern int strncasecmp(const char *str1, const char *str2, size_t num);
7.strcspn
size_t strcspn ( const char * str1, const char * str2 );
功能:在字符串 s1 中搜尋 s2 中所出現的任一個字符。
說明:返回出現 s2 中字符時已讀入的字符數,亦即在 s1 中出現而 s2 中沒有出現的子串的長度。
複製代碼
/* strcspn example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "fcba73";
char keys[] = "1234567890";
int i = strcspn (str, keys);
printf ("Already read %d characters\n", i);
printf ("The first number in both str and keys is %d th\n", i + 1);
return 0;
}
複製代碼
類似的 strspn (Returns the length of the initial portion of str1 which consists only of characters that are part of str2.)
size_t strspn ( const char * str1, const char * str2 );
複製代碼
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "1589fcba73";
char keys[] = "1234567890";
int i = strspn (str, keys);
printf ("the beginning %d characters are all in keys \n", i);
return 0;
}
複製代碼
the beginning 4 characters are all in keys
8.strlen
size_t strlen ( const char * str );
功能:計算字符串 str 的長度
說明:返回 str 的長度,不包括結束符NULL。(注意與 sizeof 的區別)
類似的 strnlen
size_t strnlen(const char *str, size_t maxlen);
9.strdup
extern char *strdup( char *str );
功能:複製字符串 str
說明:返回指向被複制的字符串的指針,所需空間由malloc()分配且可以由free()釋放。
複製代碼
#include <stdio.h>
#include <string.h>
int main ()
{
char *str = "1234567890";
char *p = strdup(str);
printf("the duplicated string is: %s\n", p);
return 0;
}
複製代碼
二、mem 系列
1.memset
void * memset ( void * ptr, int value, size_t num );
功能:把 ptr 所指內存區域的前 num 個字節設置成字符 value。
說明:返回指向 ptr 的指針。可用於變量初始化等操作
舉例:
複製代碼
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "almost erery programer should know memset!";
memset(str, '-', sizeof(str));
printf("the str is: %s now\n", str);
return 0;
}
複製代碼
2.memmove
void * memmove ( void * dest, const void * src, size_t num );
功能:由 src 所指內存區域複製 num 個字節到 dest 所指內存區域。
說明:src 和 dest 所指內存區域可以重疊,但複製後 src 內容會被更改。函數返回指向dest的指針。
舉例:
複製代碼
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove(str + 20, str + 15, 11);
printf("the str is: %s\n", str);
return 0;
}
複製代碼
the str is: memmove can be very very useful.
3.memcpy
void * memcpy ( void * destination, const void * source, size_t num );
類似 strncpy。區別:拷貝指定大小的內存數據,而不管內容(不限於字符串)。
4.memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
類似 strncmp
5.memchr
void * memchr ( const void *buf, int ch, size_t count);
功能:從 buf 所指內存區域的前 count 個字節查找字符 ch。
說明:當第一次遇到字符 ch 時停止查找。如果成功,返回指向字符 ch 的指針;否則返回NULL。
整理自:http://www.cplusplus.com/reference/clibrary/cstring/size_t/(英文的) http://www.kuqin.com/clib/string/memchr.html(錯誤較多)