c语言字符串库函数#include<string.h>
在头文件<string.h>中定义了两组字符串函数。第一组函数的名字以str开头;第二组函数的名字以mem开头。只有函数memmove对重叠对象间的拷贝进行了定义,而其他函数都未定义。比较类函数将其变量视为unsigned char类型的数组。
1 strcpy
#include <string.h>
char* strcpy(char *str1, const char *str2);
把字符串str2(包括’\0’)拷贝到字符串str1当中,并返回一个指向str1的指针。
源字符串必须以’\0’结束
会将源字符串的’\0’拷贝到目标空间
目标空间必须可变
如果参数str1所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代
实例
#include <stdio.h>
#include <string.h>
int main()
{
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strcpy(dest, src);
printf("最终的目标字符串: %s\n", dest);
return(0);
}
实现:
char * strcpy(char *dst,const char *str)
{
if(dst==NULL||str==NULL)
{
return NULL;
}
char * ret=dst;
while(*str!='\0')
{
*dst++=*str++;
}
return ret;
}
2 strncpy
char* strncpy(char* str1,const char* str2,size_t count)
把字符串str2中最多count个字符拷贝到字符串str1中,并返回str1。如果str2中少于count个字符,那么就用’\0’来填充,直到满足count个字符为止。
3 strcat
#include <string.h>
char *strcat(char *str1, const char *str2);
把str2(包括’\0’)拷贝到str1的尾部(连接),并返回str1。其中终止原str1的’\0’被str2的第一个字符覆盖。注意:str1 与 str2 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("最终的目标字符串: |%s|", dest);
return(0);
}
实现:
#include <stdio.h>
#include <assert.h>
char* strcat(char *des, const char *src)
{
assert(des != NULL && src != NULL);
char *temp = des;
while (*temp != '\0')
temp++;
while ((*temp++ = *src++) != '\0');
return des;
}
4 strncat
#include <string.h>
char *strncat(char *str1, const char *str2, size_t count);
把str2中最多count个字符连接到str1的尾部,并以’\0’终止str1,返回str1。其中终止原str1的’\0’被str2的第一个字符覆盖。注意,最大拷贝字符数是count+1
5 strcmp
int strcmp (const char* str1,const char* str2)
功能:字符串比较
返回值:若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
注意:
判断两个字符串大小1,ASII码 2,长度区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数
实例
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[15];
char str2[15];
int ret;
strcpy(str1, "abcdef");
strcpy(str2, "ABCDEF");
ret = strcmp(str1, str2);
if(ret < 0)
{
printf("str1 小于 str2");
}
else if(ret > 0)
{
printf("str1 大于 str2");
}
else
{
printf("str1 等于 str2");
}
return(0);
}
结果:
str1 大于 str2
实现:
int my_strcmp(char*arr1,char*arr2) {
int i = 0;
int size1,size2;
size1=size2=0;
for(i=0;arr[i];i++){
size1++;
}
for(i=0;arr[i];i++){
size2++;
}
if(size1 > size2){
return 1;
}
else if(size1 < size2){
return -1;
}
while (arr1[i] != '\0' && arr2[i] != '\0') {
if (arr1[i] > arr2[i]) {
return 1;
}
else if (arr1[i] < arr2[i]) {
return -1;
}
i++;
}
return 0;
}
6 strstr
char* strstr(const char* str,const char* substr)
功能:检索子串在字符串中首次出现的位置
返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL
实例
#include <stdio.h>
#include <string.h>
int main()
{
const char haystack[20] = "RUNOOB";
const char needle[10] = "NOOB";
char *ret;
ret = strstr(haystack, needle);
printf("子字符串是: %s\n", ret);
return(0);
}
结果:
子字符串是:NOOB
实现:
int strStr(char * haystack, char * needle)
{
int NL = strlen(needle);
int HL = strlen(haystack);
if(NL<1)
return 0;
int countN,countH;
for(int i=0;i<HL;i++)
{
if(HL-i<NL)
return -1;
countH =i;
countN =0;
while( haystack[countH++] == needle[countN++])
if(countN == NL)
return i;
}
return -1;
}
示例1
1:string1 = ‘hello’
2:string2 = ‘ll’
3:输出 2
示例2
1:string1 =‘hello’
2:string2 =‘oo’
3:输出 -1
7 strchr
char* strchr(const char* str,char c)
功能:查找字符串中第一次出现c的位置
返回值:返回首次出现c的位置的指针,如果s中不存在c则返回NULL
实例
#include <stdio.h>
#include <string.h>
int main ()
{
const char str[] = "http://www.runoob.com";
const char ch = '.';
char *ret;
ret = strchr(str, ch);
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
return(0);
}
结果:
|.| 之后的字符串是 - |.runoob.com|
实现
char *my_strchr(const char *s, int c)
{
if(s == NULL)
{
return NULL;
}
while(*s != '\0')
{
if(*s == (char)c )
{
return (char *)s;
}
s++;
}
return NULL;
}
int main(int argc, char *argv[])
{
const char str[]= "hello,this is a library";
char ch = 'a';
char *ret;
ret = my_strchr(str,ch);
printf ("%c后面的字符串是:%s\n",ch,ret);
return 0;
}
结果:
a后面的字符串是:a library
8 strtok
char *strtok(char *str, const char *sep)
参数:str – 要被分解成一组小字符串的字符串。
sep – 包含分隔符的 C 字符串。
功能:根据分隔符将字符串分隔成一个个片段
返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL
说明:
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了一个或者多个由sqp字符串中一个或者多个字符分割的标记
- 第一次调用时将字符串首地址传进去,之后调用不用传地址,内部会有static函数保存指向地址
- 分隔符不作为输出内容,只做分界符
- 当strtok在参数s的字符串中发现到参数sep的分割字符时则会将该字符改为’\0’字符
- 在第一次调用时,strtok必须赋予参数str字符串,往后的调用则将参数s设置成NULL
- strtok会修改原字符串,所以必须放至栈上
实例:
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "i don't want to say goodbye to you.";
const char s[3] = "to";
char *token;
/* 获取第一个子字符串 */
token = strtok(str, s);
/* 继续获取其他的子字符串 */
while( token != NULL ) {
printf( "%s\n", token );
token = strtok(NULL, s);
}
return(0);
}
结果:i don’t want
say goodbye
you
实现:
#include <string.h>
#include <stdio.h>
char * my_strtok(char *str,char *demion);
char *my_strtok(char *str,char *demion)
{
static char *p_last = NULL;
if(str == NULL && (str = p_last) == NULL)
{
return NULL;
}
char *s = str;
char *t= NULL;
while(*s != '\0')
{
t= demion;
while(*t != '\0')
{
if(*s == *t)
{
p_last = s +1;
if( s - str == NULL)
{
str = p_last;
break;
}
*s = '\0';
return str;
}
t++;
}
s++;
}
return NULL;
}
int main(void)
{
char str[] = "liusen,lin,lll";
char * result = NULL;
result = my_strtok(str,",");
printf("%s\n",result);
result = my_strtok(NULL,",");
printf("%s\n",result);
return 0;
}
9 atoi
int atoi(const char* str)
实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int val;
char str[20];
strcpy(str, "98993489");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
strcpy(str, "runoob.com");
val = atoi(str);
printf("字符串值 = %s, 整型值 = %d\n", str, val);
return(0);
}
**功能:将字符串转换成整型
返回值:返回转换后的整型数。如果str不能转换成int或者str为空字符串,那么将返回0
说明:
ANSI C规范定义了 stof()、atoi()、atol()、strtod()、strtol()、strtoul()共6个可以将字符串转换为数字的函数,可以对比学习
另外在C99/C++11规范中又新增了5个函数,分别是atoll()、strtof()、strtold()、strtoll()、strtoull()
memcpy
#include <string.h>
void *memcpy(void *to, const void *from, size_t count);
把from中的count个字符拷贝到to中。并返回to。
#include <stdio.h>
#include <string.h>
int main ()
{
const char src[50] = "http://www.runoob.com";
char dest[50];
memcpy(dest, src, strlen(src)+1);
printf("dest = %s\n", dest);
return(0);
}
结果:dest = http://www.runoob.com
memmove
#include <string.h>
void *memmove(void *to, const void *from, size_t count);
功能与memcpy类似,不同之处在于,当发生对象重叠时,函数仍能正确执行。
#include <string.h>
int main ()
{
const char dest[] = "oldstring";
const char src[] = "newstring";
printf("Before memmove dest = %s, src = %s\n", dest, src);
memmove(dest, src, 9);
printf("After memmove dest = %s, src = %s\n", dest, src);
return(0);
}
结果:Before memmove dest = oldstring, src = newstring
After memmove dest = newstring, src = newstring
memcmp
#include <string.h>
int memcmp(const void *buf1, const void *buf2, size_t count);
比较buf1和buf2的前count个字符,返回值与strcmp的返回值相同。
C 库函数 int memcmp(const void *str1, const void *str2, size_t n)) 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
memchr
#include <string.h>
void *memchr(const void *buffer, int ch, size_t count);
C 库函数 void *memchr(const void *str, int c, size_t n) 在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
返回指向ch在buffer中第一次出现的位置指针,如果在buffer的前count个字符当中找不到匹配,则返回NULL。
memset
#include <string.h>
void *memset(void *buf, int ch, size_t count);
把buf中的前count个字符替换为ch,并返回buf。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)