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

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

strcmp函数


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


1.第一个字符串大于第二个字符串,则返回大于0的数字

2.第一个字符串等于第二个字符串,则返回0

3.第一个字符串小于第二个字符串,则返回小于0的数字


如何判断两个字符串呢?

假设有如下两个字符串:


char* m = "abcdef";
  char* n = "abce";
  strcmp(m, n);


首先是两个字符串的第一个字符比较,很明显相等,再比较下一个字符,直到字符 ‘d’ 与 ‘e’ 比较,字符 ‘d’ 是小于 ‘e’ 的,所以m指向的字符串小于n指向的字符串。


#include<stdio.h>
#include<string.h>
int main()
{
  char* m = "abcdef";
  char* n = "abce";
  printf("%d", strcmp(m, n));
  return 0;
}


输出:-1


模拟实现

#include<stdio.h>
int m_strcmp(const char* str1, const char* str2)
{
  while (*str1 == *str2)
  {
  if (*str1 == '\0')
    return 0;
  str1++;
  str2++;
  }
  if (*str1 > *str2)
  return 1;
  if (*str1 < *str2)
  return -1;
}
int main()
{
  char* m = "abcdef";
  char* n = "abca";
  printf("%d", m_strcmp(m, n));
  return 0;
}


输出:1


strncmp函数


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


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


有兴趣可以自己实现一下。


strstr函数


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


1.返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。

2.匹配过程不包括终止空字符,但它在那里停止。


int main()
{
  char* m = "abcdef";
  char* n = "cde";
  printf("%s", strstr(m, n));
  return 0;
}


输出:cdef


模拟实现

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


char* m_strstr(const char* str1, const char* str2)
{
  const char* s1 = str1;       //见下图,s1 标记目标字符串每次开始查找的首元素
  const char* s2 = str2;       // s2 标记源字符串每次开始查找的首元素
  const char* p = str1;       // p 标记每次从 s1 开始遍历的元素
  if (*str2 == '\0')
  {
  return str1;
  }
  while (*p)
  {
  s1 = p;
  s2 = str2;        //每次循环开始将 s1 移到后一个元素处,s2 移到首元素处
  while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
  {
    s1++;
    s2++;
  }
  if (*s2 == '\0')      //当源字符串遍历完了后即找到了
  {
    return (char*)p;   
  }
  p++;
  }
  return NULL;   //找不到子串
}
int main()
{
  char* m = "abcdef";
  char* n = "cde";
  printf("%s", m_strstr(m, n));
  return 0;
}


f286e7c3ddd945d3a9da6b644950d3c5.png


当第一次没找到后,第二次循环 s1 、p指向如图:


49643f88016145c796b5c34038460b1b.png


若 p 指向 ‘\0’ ,则表示找不到该字符串,退出循环。


memcpy函数


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


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

2.这个函数在遇到 ‘\0’ 的时候并不会停下来。

3.如果source和destination有任何的重叠,复制的结果都是未定义的。


int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  memcpy(arr2, arr, 20);
  return 0;
}


我们来看看内存分配情况:


6f86534c35644cebba94e77c4693d3ff.png


由图可以看出memcpy函数改变了20字节的内容,也就是5个整型,改变了5个整型数,那么它是什么方式改变这20字节的呢?

a1e9cb1575454cd28881262b84505758.png


从左到右一个字节一个字节的依次复制,直到20个字节。


模拟实现

void* m_memcpy(void* destination, const void* source, size_t num)
{
  void* p = destination;
  while (num--)      //循环num次
  {
  *(char*)destination = *(char*)source;   //char型访问一个字节,方便逐个字节打印
  destination = (char*)destination + 1;
  source = (char*)source + 1;
  }
  return p;
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int arr2[10] = { 0 };
  m_memcpy(arr2, arr, 20);
  return 0;
}

相关文章
|
7月前
|
C语言
字符函数和字符串函数
字符函数和字符串函数
78 0
|
C语言 Python
字符函数和字符串函数(下)
字符函数和字符串函数(下)
58 0
字符函数和字符串函数(下)
|
C语言
字符函数和字符串函数(上)
字符函数和字符串函数
|
C语言
字符函数和字符串函数(下)
字符函数和字符串函数(下)
详解字符函数和字符串函数-1
详解字符函数和字符串函数
49 0
|
C语言
详解字符函数和字符串函数-2
详解字符函数和字符串函数
54 0
|
编译器 C语言 Python
字符函数和字符串函数(上)
字符函数和字符串函数(上)
53 0
|
存储 安全
常用的字符函数和字符串函数
常用的字符函数和字符串函数
101 0
|
C语言
字符函数和字符串函数详解(一)
字符函数和字符串函数详解
54 0