[C语言]字符串函数大全
字符串拷贝
memcpy()
- 原型
void *memcpy(char *dest, const char *source, size_t n);
-
功能
把从source
所指向内存地址的起始位置开始拷贝n
个字节到dest
所指内存地址的起始位置中.
从source
指向的对象中复制n
个字符到s1
指向的对象中 -
说明
-
source
和dest
所指内存区域可以重叠, 但是如果重叠,memcpy
不保证source
所在重叠区域在拷贝之前不被覆盖. -
source
和dest
都不一定是数组,任意的可读写的空间均可
-
-
示例
int main(void)
{
char src[]="******************************";
char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
printf("destination before memcpy:%s\n",dest);
memcpy(dest,src,strlen(src));
printf("destination after memcpy:%s\n",dest);
return 0;
}
memmove()
- 原型
void *memmove(char *dest, const char *source, size_t n);
-
功能
把从source
所指向内存地址的起始位置开始拷贝n
个字节到dest
所指内存地址的起始位置中. -
说明
没有memcpy
的缺点 -
示例
int main(void)
{
char src[]="******************************";
char dest[]="abcdefghijlkmnopqrstuvwxyz0123as6";
printf("destination before memcpy:%s\n",dest);
memcpy(dest,src,strlen(src));
printf("destination after memcpy:%s\n",dest);
return 0;
}
strcpy()
- 原型
char *strcpy(char *dest, const char *source);
-
功能
把从source
地址开始且含有NULL结束符的字符串复制到以dest
开始的地址空间 -
说明
source
和dest
所指内存区域不可以重叠且dest
必须有足够的空间来容纳source
的字符串。 -
示例
int main(void)
{
char string[10];
strcpy(string, "zhangrong");
printf("%s\n", string);
strcpy(string, "wang");
printf("%s\n", string);
return 0;
}
strncpy()
- 原型
char *strncpy(char *dest, const char *source, size_t n);
-
功能
复制字符串src
中的内容(字符,数字、汉字....)到字符串dest
中,复制多少由size_t n
的值决定。
如果src
的前n
个字节不含NULL字符,则结果不会以NULL字符结束。
如果src
的长度小于n
个字节,则以NULL填充dest
直到复制完n
个字节。 -
说明
src
和dest
所指内存区域不可以重叠且dest
必须有足够的空间来容纳src
的字符长度+'\0'
。 -
示例
int main(void)
{
char string[10];
char *str1 = "abcdefghi";
strncpy(string, str1, 3);
string[3] = '\0';
printf("%s\n", string);
return 0;
}
字符串拼接
strcat()
- 原型
char *strcat(char *dest, const char *source);
-
功能
把src
所指字符串添加到dest
结尾处(覆盖dest
结尾处的'\0')并添加'\0'。 -
说明
source
和dest
所指内存区域不可以重叠且dest
必须有足够的空间来容纳source
的字符串。 -
示例
int main(void)
{
char destination[25];
char *blank = " ", *c = "C++", *Borland = "Borland";
strcpy(destination, Borland);
strcat(destination, blank);
strcat(destination, c);
printf("%s\n", destination);
return 0;
}
strncat()
- 原型
char *strncat(char *dest, const char *source, size_t n);
-
功能
把src
所指字符串添加到dest
结尾处(覆盖dest
结尾处的'\0')并添加'\0'。 -
说明
source
和dest
所指内存区域不可以重叠且dest
必须有足够的空间来容纳source
的字符串。 -
示例
int main()
{
char d[20] = "GoldenGlobal";
char * s = "ViewWinIDELibrary";
strncat(d,s,4);
printf("%s\n",d);
return 0;
}
字符串比较
memcmp()
- 原型
int memcmp(const void *s1, const void s2, size_t n);
-
功能
将s1
指向对象的前n
个字节和s2
指向对象的前n
个字节进行比较 -
说明
-
当
s1
>s2
时,返回正数 -
当
s1
=s2
时,返回值 = 0 -
当
s1
<s2
时,返回为负数
-
-
示例
strcmp()
- 原型
int strcmp(const char *s1, const char *s2);
-
功能
比较字符串s1
和s2
-
说明
-
当
s1
<s2
时,返回为负数 -
当
s1
=s2
时,返回值 = 0 -
当
s1
>s2
时,返回正数
-
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'
为止
- 示例
int main()
{
printf("%d\n", strcmp("wang", "wang"));
printf("%d\n", strcmp("wang", "zhang"));
printf("%d\n", strcmp("zhang", "wang"));
return 0;
}
- 源码
strcoll()
和strcmp
类似
strncmp()
- 原型
int strncmp(const char *s1, const char *s2, size_t n);
-
功能
比较字符串s1
和s2
的前n
个字符 -
说明
-
当
s1
<s2
时,返回为负数 -
当
s1
=s2
时,返回值 = 0 -
当
s1
>s2
时,返回正数
-
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'
为止
- 示例
strxfrm
字符串搜索
memchr()
- 原型
void *memchr(const void *buf, int ch, size_t count);
-
功能
从buf
所指内存区域的前count
个字节查找字符ch
-
说明
当第一次遇到字符ch
时停止查找。如果成功,返回指向字符ch
的指针;否则返回NULL。 -
示例
int main(void)
{
char buf[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
printf("%s\n", memchr(buf, 'h', 20));
return 0;
}
- 源码
void * memchr(const void *s, int c, size_t n)
{
const unsigned char uc = c;
const unsigned char *su;
for(su = s; 0 < n; ++su, --n)
{
if( *su == uc)
return ( (void *)su );
}
return NULL;
}
strchr()
- 原型
char *strchr(const char *s,char c);
-
功能
查找字符串s
中首次出现字符c
的位置 -
说明
返回首次出现c
的位置的指针,返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置,
如果s
中不存在c
则返回NULL。 -
示例
int main(void)
{
char buf[] = "abcdefghijlkmnopqrstuvwxyz0123as6";
printf("%s\n", strchr(buf, 'h'));
return 0;
}
strrchr()
- 原型
char *strrchr(const char *str, char c);
-
功能
查找一个字符c
在另一个字符串str
中末次出现的位置 -
说明
-
示例
int main(void)
{
char *str = "abcdefghijlkabcdefg";
printf("%s\n", strrchr(str, 'b'));
printf("%s\n", strchr(str, 'b'));
return 0;
}
strspn()
strcspn()
- 原型
size_t strcspn(const char *s1, const char *s2);
-
功能
顺序在字符串s1
中搜寻与s2
第一个相同字符,包括结束符NULL,返回这个字符在s1
中第一次出现的位置。 -
说明
在字符串s1
中搜索字符串s2
, 返回s2
在s1
中第一次出现的下标值 -
示例
int main(void)
{
char *s1 = "abcdefghijlkmnopqrstuvwxyz0123as6";
char *s2 = "def";
printf("%d\n", strcspn(s1, s2));
return 0;
}
strpbrk()
strstr()
- 原型
char *strstr(char *s1, const char *s2);
-
功能
找出字符串s2
在字符串s1
中第一次出现的位置 -
说明
返回该位置的指针, 如果找不到, 返回NULL -
示例
int main(void)
{
char *s1 = "abcdefghijlkabcdefg";
char *s2 = "def";
printf("%s\n", strstr(s1, s2));
return 0;
}
strtok()
- 原型
char *strtok(char *s, const char *delim);
-
功能
分解字符串为一组字符串。s
为要分解的字符串,delim
为分隔符字符串。 -
说明
- 参数
s
指向欲分割的字符串, 参数delim
则为分割字符串中包含的所有字符 - 当
strtok()
在参数s
的字符串中发现参数delim
中包含的分割字符时,则会将该字符改为\0
字符 - 在第一次调用时,
strtok()
必需给予参数s字符串,往后的调用则将参数s
设置成NULL。每次调用成功则返回指向被分割出片段的指针。
- 参数
-
示例
Miscellaneous
memset()
- 原型
void *memset(void *s, int ch, size_t n);
-
功能
将s
中前n
个字节用ch
替换并返回s
。 -
说明
对较大的结构体或数组进行清零操作的一种最快方法 -
示例
int main(void)
{
char s1[] = "abcdefghijlkabcdefg";
memset(s1, 0x00, sizeof(s1)/sizeof(char));
printf("%s\n", s1);
return 0;
}
strerror()
strlen()
- 原型
size_t strlen(const char *s);
-
功能
计算字符串s
的长度,不包括'\0'
在内 -
说明
-
示例
int main(void)
{
char s1[] = "abcdefghijlkabcdefg";
printf("%d\n", strlen(s1));
printf("%d\n", sizeof(s1));
return 0;
}
Good Good Study! Day Day Up!