1、头文件
#include <string.h>
2、初始化
void *memset(void *s, int c, size_t n);
功能:
把s所指的内存开始的n个字节清为c
参数:
s:需要初始化的首地址
c:填充的字符
n:地址的长度
返回:
s指向的地址
3、计算字符串长度
size_t strlen(const char *s);
功能:
计算字符串的长度,从第1个字符开始直到结束符’\0’
参数:
待计算的字符串开始地址
返回:
得到的字符串长度
4、连接字符串
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
功能:
连接字符串(dest = dest + src)
参数:
dest:目标字符串首地址
src:源字符串首地址
n:src的长度
返回:
dest指向的地址
5、比较字符串
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
int memcmp(const void *s1, const void *s2, size_t n);
int strcasecmp(const char *s1, const char *s2);
int strncasecmp(const char *s1, const char *s2, size_t n);
功能:
比较字符串
strcmp/strncmp比较到结束符’\0’;
memcmp不管是否遇到’\0’,一直比较n个;
strcasecmp/strncasecmp忽略大小写(POSIX标准中定义)
参数:
s1:字符串1
s2:字符串2
n:比较的长度
返回:
负值/0/正值
ASCII码’a’比’A’大返回正值
6、从字符串中搜索某个字符
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
功能:
从字符串中搜索字符
strchr:从左往右
strrchr:从右往左
参数:
s:被查找的字符串
c:要查找的某个字符
返回:
字符c第一次出现的位置,若没有则为NULL
7、从字符串中搜索字符串
char *strstr(const char *haystack, const char *needle);
char *strcasestr(const char *haystack, const char *needle);
功能:
从字符串haystack中搜索needle字符串,strstr与strcasestr使用方法一样,但后者不区分大小写。
另外,strcasestr函数是非标准的,所以需要在#include <string.h>
前面添加宏定义#define _GNU_SOURCE
或在编译时加上-D_GNU_SOURCE
选项。(参考:https://stackoverflow.com/questions/9935642/how-do-i-use-strcasestr)
参数:
haystack:被查找的字符串
needle:要查找的字符串
返回:
返回字符串haystack中第一次出现字符串needle的地址;如果没有检索到则返回NULL
8、分割字符串
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
功能:
分割字符串str,第二次直接传NULL,因为它内部是一个静态指针,会记住上次位置,它会按照delim一次分割一部分,会改变str,将剩余的字符串保存在saveptr变量中
参数:
str:待分割的字符串
delim:分隔符
saveptr:保存剩余字符串
返回:
返回分割得到的字符串地址
9、程序示例
#define _GNU_SOURCE /* 为兼容strcasestr函数 */
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
char str1[10];
memset(str1, 0, 10);
char str2[10] = "Hello";
int len = strlen(str2);
printf("len = %d\n", len);
printf("sizeof = %lu\n", sizeof(str2));
/* output:
len = 5
sizeof = 10
*/
char str3[20] = "Hello";
char str4[10] = "World";
printf("link1: %s\n", strcat(str3 ,str4));
printf("link2: %s\n", strncat(str3 ,str4, 3));
/* output:
link1: HelloWorld
link2: HelloWorldWor
*/
char str5[10] = "Hello";
char str6[10] = "hello";
if(0 == strncmp(str5, str6, 5))
printf("str5 == str6\n");
else
printf("str5 != str6\n");
/* output:
str5 != str6
*/
if(0 == strncasecmp(str5, str6, 5))
printf("str5 == str6\n");
else
printf("str5 != str6\n");
/* output:
str5 == str6
*/
const char *str7 = "Hello world!";
printf("strchr: %s\n", strchr(str7, 'o'));
printf("strrchr: %s\n", strrchr(str7, 'o'));
/* output:
strchr: o world!
strrchr: orld!
*/
printf("strstr: %s\n", strstr(str7, "ll"));
printf("strcasestr: %s\n", strcasestr(str7, "LL"));
/* output:
strstr: llo world!
strcasestr: llo world!
*/
char str8[] = "192.168.1.123";
char *str9;
str9 = strtok(str8, ".");
printf("strtok cut: %s\n", str9);
printf("strtok src: %s\n", str8);
while((str9 = strtok(NULL, ".")) != NULL){
printf("strtok cut: %s\n", str9);
printf("strtok src: %s\n", str8);
}
/* output:
strtok cut: 192
strtok src: 192
strtok cut: 168
strtok src: 192
strtok cut: 1
strtok src: 192
strtok cut: 123
strtok src: 192
*/
char str10[] = "192.168.1.123";
char *str11;
char *str12;
str11 = strtok_r(str10, ".", &str12);
printf("strtok_r cut: %s\n", str11);
printf("strtok_r save: %s\n", str12);
printf("strtok_r src: %s\n", str10);
while((str11 = strtok_r(NULL, ".", &str12)) != NULL){
printf("strtok_r cut: %s\n", str11);
printf("strtok_r save: %s\n", str12);
printf("strtok_r src: %s\n", str10);
}
/* output:
strtok_r cut: 192
strtok_r save: 168.1.123
strtok_r src: 192
strtok_r cut: 168
strtok_r save: 1.123
strtok_r src: 192
strtok_r cut: 1
strtok_r save: 123
strtok_r src: 192
strtok_r cut: 123
strtok_r save: (null)
strtok_r src: 192
*/
return 0;
}