字符操作函数和内存操作函数

1 字符操作函数

1.strlen

size_t strlen ( const char * str );

函数功能:返回以'\0'结尾的字符串长度,不包含'\0'。

注:strlen返回值是一个无符号整数size_t。

#include <stdio.h>

int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else

 {
 printf("srt1>str2\n");
 }
 return 0;
}

2.strcpy

 char* strcpy(char * destination, const char * source );

函数功能:将源字符串以“\0”结束的字符串拷贝到目标地址中。

函数参数:char * destination:目标地址。const char * source:源地址。

注:目标地址的空间必须可变,不能是const修饰的常量字符串。源地址字符串以“\0”作为结束标志。

3.strcat

char * strcat ( char * destination, const char * source );

函数功能:在目标字符串后面追加源字符串

函数参数:char * destination:目标字符串。const char * source:源字符串。

注:目标空间必须可变且要足够大。

int main()
{
	char str1[30] = "abcdef";
	char* str2 = "bbb";
	strcat(str1, str2);
	printf("%s",str1);
	return 0;
}

3.strcmp

int strcmp ( const char * str1, const char * str2 ); 

函数功能:比较两个字符串大小。

函数参数:const char * str1:字符串1。const char * str2:字符串2。

规定标准:当str1和str2字符串完全相等时返回0。当str1>str2字符串时返回值>0。当str1<str2时返回值<0。

4.strncpy

char * strncpy ( char * destination, const char * source, size_t num );

函数功能:将源地址中的字符串从首地址开始的num个字符拷贝到以目标地址为首地址的字符串

函数参数:char * destination:目标地址。const char * source:源地址。size_t num:字符个数。

注:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

int main()
{
	char str1[10];
	char* str2 = "abc";
	strncpy(str1, str2, 8);
	printf("%s",str1);
	return 0;
}

5. strncat

char * strncat ( char * destination, const char * source, size_t num );

函数功能:目标地址字符串末尾追加num个源地址的字符。

函数参数:char * destination:目标地址。const char * source:源地址。size_t num:字符个数。

#include <stdio.h>
#include <string.h>
int main ()
{
 char str1[20];
 char str2[20];
 strcpy (str1,"To be ");
 strcpy (str2,"or not to be");
 strncat (str1, str2, 6);
 puts (str1);
 return 0;
}

6.strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

函数功能:比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

int main ()
{
  char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
  int n;
  puts ("Looking for R2 astromech droids...");
  for (n=0 ; n<3 ; n++)
  if (strncmp (str[n],"R2xx",2) == 0)
 {
    printf ("found %s\n",str[n]);
 }
  return 0;
}

7.strstr

char * strstr ( const char *, const char * );

函数功能:在一个字符串中找另一个字符串的子串。

函数返回值:如果包含另一个字符串的子串则返回包含字符串内找到的字符串首地址。没找到返回NULL。

int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	puts(pch);
	return 0;
}

8.strtok

char * strtok ( char * str, const char * sep );

函数功能:按给出的分割符号分割字符串。

函数参数:char * str:字符串首地址,包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。const char * sep:分隔符的集合。

过程:strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改 变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。

int main()
{
	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, " ,.-");
	}
	return 0;
}

9.strerror

char * strerror ( int errnum );

函数功能:返回错误码所对应的错误信息。

#include <stdio.h> 
#include <string.h> 
#include <errno.h>//必须包含的头文件 
int main () 
{ 
 FILE * pFile; 
 pFile = fopen ("unexist.ent","r"); 
 if (pFile == NULL) 
 printf ("Error opening file unexist.ent: %s\n",strerror(errno)); 
 //errno: Last error number 
 return 0; 
} 

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘ \f ’,换行‘ \n ’,回车‘ \r ’,制表符‘ \t ’,或者垂直制表‘ \v ’ 。
isdigit十进制数字1~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z,A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

字符转换:

int tolower ( int c );//参数c转小写

int toupper ( int c );  //参数c转大写

2 内存操作函数

1.memcpy

void * memcpy ( void * destination, const void * source, size_t num );

函数功能:函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

函数参数:void * destination:目标地址。const void * source:源地址。size_t num:操作字节数。

注:这个函数在遇到 '\0' 的时候并不会停下来。 如果source和destination有任何的重叠,复制的结果都是未定义的。

2.memmove

void * memmove ( void * destination, const void * source, size_t num );

函数功能:与memcpy类似,和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

函数参数:void * destination:目标地址。const void * source:源地址。size_t num:操作字节数。

注:如果源空间和目标空间出现重叠,就得使用memmove函数处理。

#include <stdio.h> 
#include <string.h> 
 
int main () 
{ 
 char str[] = "memmove can be very useful......"; 
 memmove (str+20,str+15,11); 
 puts (str); 
 return 0; 
}

3.memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

函数功能:比较从ptr1和ptr2指针开始的num个字节。

函数参数:const void * ptr1:字符串1。const void * ptr2:字符串2。

规定标准:当ptr1和ptr2字符串完全相等时返回0。当ptr1>ptr2字符串时返回值>0。当ptr1<ptr2时返回值<0。

3 部分函数模拟实现

1.strlen

//计数器版本
int my_strlen1(const char* str)
{
	int count = 0;
	assert(str);
	while (*str++)
	{
		count++;
	}
	return count;
}
//递归版本
int my_strlen2(const char* str)
{
	if (*str != '\0')
	{
	return my_strlen2(++str)+1;
	}
	return 0;
}

 

2.strcpy 

char* my_strcpy(char* str1, char* str2)
{
	char* p = str1;
	while (*str1++ = *str2++)
	{
		;
	}
	return p;
}

 3.strcat

char* my_strcat(char* str1, char* str2)
{
	while (*str1!= '\0')
	{
		str1++;
	}
	while (*str1++ = *str2++)
	{
		;
	}
}

4. strstr

char* my_strstr(char* str1, char* str2)
{
	char* str1_p = str1;
	char* str2_p = str2;
	while (*str2_p != '\0')
	{
		if (*str2_p == *str1_p)
		{
			str2_p++;
			str1_p++;
		}
		else
		{
			str2_p = str2;
            str1_p = str1;
			str1++;
		}
	}
	return str1;
}

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值