字符函数和字符串函数详解(三)

简介: 字符函数和字符串函数详解

memmove函数


不知道大家有没有想过,如果是自己复制自己,那memcpy为什么不能用呢?什么函数可以实现呢?

memcpy函数会改变目标数据,如果目标数据与源数据有重叠,可能导致

如下情况:

00838d62c82849ae9dacb97060d50624.png



假设我要把1 2 3 4 复制到3 4 5 6 的位置上,那么从前往后就是如图,我们可以看到原来的3 4 变为了1 2 ,然后1 2 再复制到5 6 处,原来的3 4 5 6 就变为了1 2 1 2,这与我们要的结果不同,所以不能用该函数了,那么我们应该如何才能正确打印呢?


我们发现如果从后往前复制就可以很好的避免这种情况发生,即从两数据重叠处开始复制。而memmove函数就很好的解决了这点。


我们来看看memmove函数:


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

1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

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


#include<stdio.h>
#include<string.h>
int main()
{
  int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
  memmove(arr1 + 2, arr1, 20);
  return 0;
}


db264eba52024d52b2b5404053748f59.png


模拟实现

void* m_memmove(void* destination, const void* source, size_t num)
{
  void* p = destination;
  if (destination < source)
  {
  while (num--)
  {       //从前往后复制
    *(char*)destination = *(char*)source;
    destination = (char*)destination + 1;
    source = (char*)source + 1;
  }
  }
  else
  {
  while (num--)
  {       //从后往前复制
    *((char*)destination+num) = *((char*)source+num);
  }
  }
  return p;
}
int main()
{
  int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
  m_memmove(arr1 + 2, arr1, 20);
  return 0;
}


strtok函数


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


1.sep参数是个字符串,定义了用作分隔符的字符集合。

2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

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

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

5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。(该函数具有记忆功能)

6.如果字符串中不存在更多的标记,则返回 NULL 指针。


我们来具体看看:


#include<stdio.h>
#include<string.h>
int main()
{
  char arr[] = "zhangsan@baidu.com";
  char buf[200] = { 0 };
  strcpy(buf, arr);     //将arr的内容复制到buf中
  const char* p = "@.";
  char* str = strtok(buf, p);  //找到第第一个标记字符'@',并将其改为'\0',返回指向这个字符串的指针
  printf("%s\n", str);   //打印: zhangsan
  str = strtok(NULL, p);   //从上次标记的'\0'开始查找下一个标记符号,重复以上操作
  printf("%s\n", str);    //打印: baidu
  str = strtok(NULL, p);
  printf("%s\n", str);     //打印: com
  return 0;
}


简化一下:


int main()
{
  char arr[] = "zhangsan@baidu.com";
  char buf[200] = { 0 };
  strcpy(buf, arr);
  const char* p = "@.";
  char* str = NULL;
  for (str=strtok(buf, p); str!=NULL; str=strtok(NULL, p))
  {
  printf("%s\n", str);
  }
  return 0;
}


strerror函数


char * strerror ( int errnum );


返回错误码,所对应的错误信息。


#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{                  //errno - C语言提供的全局的错误变量
  printf("%s\n", strerror(0));
  //printf("%s\n", strerror(1));
  //printf("%s\n", strerror(2));
  //printf("%s\n", strerror(3));
  //printf("%s\n", strerror(4));
  return 0;
}


输出:


8b9cda8da7e6454f997233ec7b849839.png


其他的错误变量对应的错误码可以自己输出试试。


字符分类函数


cc2c0032a2564fe88d0fdc19a40ff830.png


返回真就是返回大于0的数,可用于条件判断。


字符转换


int tolower ( int c );   //大写转小写
  int toupper ( int c );   //小写转大写


我们来看下面一段小写转大写的代码:


#include<stdio.h>
#include <ctype.h>
int main()
{
  char arr[] = "Are you ok?";
  char* p = arr;
  while (*p)
  {
  if (islower(*p))   //判断是否是小写
  {
    *p = toupper(*p);    //小写转大写
  }
  p++;
  }
  printf("%s\n", arr);
  return 0;
}


输出:ARE YOU OK?


本希望本期内容对大家能有所帮助,下期见了~


相关文章
|
3月前
|
C语言
字符函数和字符串函数
字符函数和字符串函数
51 0
|
8月前
|
存储 C语言
字符串函数介绍&应用(一)
字符串函数介绍&应用
|
8月前
|
存储 C语言
字符串函数介绍&应用(二)
字符串函数介绍&应用
|
4月前
|
C语言
字符函数和字符串函数(上)
字符函数和字符串函数
|
4月前
|
C语言
字符函数和字符串函数(下)
字符函数和字符串函数(下)
|
4月前
详解字符函数和字符串函数-1
详解字符函数和字符串函数
23 0
|
4月前
|
C语言
详解字符函数和字符串函数-2
详解字符函数和字符串函数
25 0
|
6月前
|
编译器 C语言 Python
字符函数和字符串函数(上)
字符函数和字符串函数(上)
30 0
|
6月前
|
C语言 Python
字符函数和字符串函数(下)
字符函数和字符串函数(下)
26 0
字符函数和字符串函数(下)
|
7月前
|
存储 安全
常用的字符函数和字符串函数
常用的字符函数和字符串函数
66 0