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

注意:可点击这个链接C语言你想知道的函数里面都有


字符函数、字符串函数
求字符串长度
strlen
长度不受限制的字符串函数
strcpy
strcat
strcmp

长度受限制的字符串函数介绍
strncpy
strncat
strncmp

字符串查找
strstr
strtok

错误信息报告
strerror

内存操作函数
memcpy
memmove
memcmp
memset

字符函数和字符串函数

strlen函数

函数声明:size_t strlen ( const char * str );
作用:获取字符串长度
返回值:字符串的长度
注意事项
1.字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
3.注意函数的返回值为size_t,是无符号的(返回的是字符串的长度)

/* strlen example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char szInput[256];
  printf ("Enter a sentence: ");
  gets (szInput);
  printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
  return 0;
}

strcpy函数

函数声明:char* strcpy(char * destination, const char * source );
作用:复制字符串(将source指向的 C 字符串复制到目标指向的数组destination中,包括终止的 ‘\0’ 字符(并在该点停止)。为避免溢出,目标指向的数组的大小应足够长,以包含与源相同的 C 字符串(包括终止空字符),并且不应在内存中与源重叠。)(将source复制到destination)
返回值:返回形参destination
注意事项
1.源字符串必须以 ‘\0’ 结束。
2.会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。

4.目标空间必须可变。(也就是目标空间内容不能是常量字符串,或者被const锁定的也不行)

/* strcpy example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,"copy successful");
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

strcat函数

函数声明:char * strcat ( char * destination, const char * source );
作用:连接字符串(将源字符串的副本追加到目标字符串。目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。)(将source追加到destination)
返回值:返回形参destination
注意事项
1.源字符串必须以 ‘\0’ 结束。目标字符也是要以‘\0’结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。

/* strcat example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

strcmp函数

函数声明:int strcmp ( const char * str1, const char * str2 );
作用:比较两个字符串(将 C 字符串 str1 与 C 字符串 str2 进行比较。
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止空字符。)
返回值:返回看注意事项
注意事项
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字

#include <stdio.h>
#include <string.h>

int main ()
{
  char key[] = "apple";
  char buffer[80];
  do {
     printf ("Guess my favorite fruit? ");
     fflush (stdout);
     scanf ("%79s",buffer);
  } while (strcmp (key,buffer) != 0);
  puts ("Correct answer!");
  return 0;
}

strncpy函数

函数声明:char * strncpy ( char * destination, const char * source, size_t num );
作用:将源的第一个字符数复制到目标。如果在复制 num 个字符之前找到源 C 字符串的末尾(由 ‘\0’字符表示),则目标将填充零(也就是’\0’),直到总共写入 num 个字符为止。(将source复制到destination)
返回值:返回形参destination
注意事项
1.拷贝num个字符从源字符串到目标空间。
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
3.这个和strcpy的区别就是可以指定源被复制的字节个数,char的大小是一个字节,也就是可以指定被复制的字符的个数。

/* strncpy example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str1[]= "To be or not to be";
  char str2[40];
  char str3[40];

  /* copy to sized buffer (overflow safe): */
  strncpy ( str2, str1, sizeof(str2) );

  /* partial copy (only 5 chars): */
  strncpy ( str3, str2, 5 );
  str3[5] = '\0';   /* null character manually added */

  puts (str1);
  puts (str2);
  puts (str3);

  return 0;
}

strncat函数

函数声明:char * strncat ( char * destination, const char * source, size_t num );
作用:从字符串追加字符(将source追加到destination)
返回值:返回形参destination
注意事项
1.将源的第一个数字字符追加到目标,外加一个终止空字符。
2.如果源中 C 字符串的长度小于 num,则仅复制终止空字符之前的内容。
3.和strcat的区别就是可以指定追加字符的个数。

/* strncat example */
#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;
}

strncmp函数

函数声明:int strncmp ( const char * str1, const char * str2, size_t num );
作用:比较两个字符串的字符(将 C 字符串 str1 的字符数与 C 字符串 str2 的字符数进行比较。此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用以下对,直到字符不同,直到达到终止的空字符。)
返回值:和strcmp类似
注意事项
1.比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
2.与strcmp的区别就是这个函数可以指定比较字符的个数。

/* strncmp example */
#include <stdio.h>
#include <string.h>

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;
}

strstr函数

函数声明:char * strstr ( const char *str1, const char * str2);
作用:查找子字符串(返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。)(也就是查找str2在str1中有没有)
返回值:返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针(NULL)。
注意事项
1.返回值要搞清楚。

/* strstr example */
#include <stdio.h>
#include <string.h>

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

strtok函数

函数声明:char * strtok ( char * str, const char * sep );
作用:将字符串分割(sep就写入要分割的位置所要识别的字符)

返回值
1.如果找到令牌(sep里所包含的字符),则指向令牌开头的指针。
2.当在正在扫描的字符串中到达字符串的末尾(即空字符’\0’)时,始终返回空指针。
注意事项
1.sep参数是个字符串,定义了用作分隔符的字符集合
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "zpengwei@yeah.net@666#777";
	char copy[30];
	strcpy(copy, arr);

	char sep[] = "@.#";
	char* ret = NULL;

	for (ret = strtok(copy, sep); ret != NULL; ret=strtok(NULL, sep))
	//这种方式更好,可以自己识别查询次数
	{
		printf("%s\n", ret);
	}

	//char* ret = strtok(copy, sep);
	//printf("%s\n", ret);
	//
	//ret = strtok(NULL, sep);
	//printf("%s\n", ret);

	//ret = strtok(NULL, sep);
	//printf("%s\n", ret);


	

	return 0;
}

strerror函数

函数声明:char * strerror ( int errnum );
作用:获取指向错误消息字符串的指针
返回值:指向描述错误错误的字符串的指针
注意事项
1.库函数在执行的时候,发生了错位,将一个错误码存放在errno这个变量中,errno是C语言提供的一个全局变量
2.而strerror函数就可以将错误码翻译成对应的错误信息,也就是一个字符串。
3.在发现代码有问题的时候,我们不知道是什么原因,那么我们就可以利用这个函数来确定我们错误的原因。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
	//C语言中可以操作文件
	//操作文件的步骤
	//1. 打开文件
	//2. 读/写
	//3. 关闭文件

	FILE* pf = fopen("data.txt", "r");
	//fopen函数打开文件,r是只读的意思
	//如果读取失败就会返回空指针
	//并且错误码会传给errno,用strerror函数就可以把错误码转换成错误信息
	if (pf == NULL)
	{
		printf("fopen: %s\n", strerror(errno));
		perror("fopen");//这个函数和我上面写的printf函数作用一样
	//,但是格式更完整,他自己就有fopen:
		//fopen: xxxxxx
		return 1;
	}
	//读文件
	//...

	//关闭文件
	fclose(pf);

	return 0;
}

perror的结果显示是第二个结果

内存操作函数

memcpy函数

函数声明: void * memcpy ( void * destination, const void * source, size_t num );
**作用:**复制内存块(显而易见,memcpy复制的是内存块,而strcpy复制的是字符串,也就是说memcpy可以复制字符串,整型数组,结构体等)将字节数的值从源指向的位置直接复制到目标指向的内存块。
**返回值:**返回形参destination。
注意事项:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。(source和destination不能有重叠,这是标准规定,但是现在在某些编译器里是可以重叠的,为了写的代码适应所有的编译器,建议不要重叠

/* memcpy example */
#include <stdio.h>
#include <string.h>

struct {
  char name[40];
  int age;
} person, person_copy;

int main ()
{
  char myname[] = "Pierre de Fermat";

  /* using memcpy to copy string: */
  memcpy ( person.name, myname, strlen(myname)+1 );
  person.age = 46;

  /* using memcpy to copy structure: */
  memcpy ( &person_copy, &person, sizeof(person) );

  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );

  return 0;
}

memmove函数

函数声明: void * memmove ( void * destination, const void * source, size_t num );
**作用:**移动内存块(这个函数和memcpy唯一的区别就是这个函数的source和destination可以重叠)
**返回值:**返回形参destination。
注意事项:
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。

/* memmove example */
#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;
}

memcmp函数

函数声明: int memcmp ( const void * ptr1, const void * ptr2, size_t num );
作用:
1.比较两个内存块(显而易见这个函数与strcmp的区别就是strcmp只能比较字符串,而memcmp函数可以比较字符串,整型数组,结构体等)

2.将 ptr1 指向的内存块的前 num 字节数与 ptr2 指向的第一个字节数进行比较,如果它们都匹配,则返回零,如果不匹配,则返回一个不同于零的值,表示哪个值更大。
返回值:
返回一个整数值,该值指示内存块内容之间的关系:

返回值   表明
<0	    两个内存块中不匹配的第一个字节在 PTR1 中的值低于 PTR2 中的值(如果评估为无符号字符值)
0	    两个内存块的内容相等
>0	    两个内存块中不匹配的第一个字节在 PTR1 中的值大于在 PTR2 中的值(如果评估为无符号字符值)

注意事项:
1.与 strcmp 不同,该函数在找到空字符后不会停止比较。

/* memcmp example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";

  int n;

  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );

  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

分享就到这里啦,欢迎pro们在评论区讨论!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值