适合初学者的字符函数和字符串函数(学不会打我)上(二)

简介: 适合初学者的字符函数和字符串函数(学不会打我)

strstr函数部分


char *strstr( const char * string , const char * strCharSet )

Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.


Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.


函数返回一个指针,指向字符串中第一次出现的地址,如果该地址未出现在字符串中,则返回 NULL。如果该地址指向长度为零的字符串,则该函数返回字符串。


简单例子:


#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include<assert.h>
char * my_strstr(char* a, char* b)
{
  assert(a && b);
  char* s1 = NULL;
  char* s2 = NULL;
  char* cp = a;
  while (*cp)
  {
  s1 = cp;
  s2 = b;
  while (*a++ == *b++)
  {
    ;
  }
  if (*b == '\0')
  {
    return cp;
  }
  cp++;
  }
  return NULL;
}
int main()
{
  char a[10] = "bcdef";
  char b[10] = "cde";
  if (my_strstr(a, b) == NULL)
  {
  printf("找不到");
  }
  else
  {
  printf("找到了,地址是%p", my_strstr(a, b));
  }
  return 0;
}


分析


假设有两个字符串,指针str1, str2分别指向字符串首字母。

要在str1中查找str2并打印出来,先判断str1和str2指向的字符是否相等,此时有两种情况:第一种情况指向的字符不相等,str1要指向下一个字符,再判断,如此循环往复,当str1指向的是 '\0' 时,可以判断出str1中不存在str2,此时返回NULL;

第二种情况下指向的字符相等,那么不仅str1要向后读取字符,str2也要向后读取字符,再判断是否相等。

在向后读取字符的过程中,仍有两种情况:1.str1和str2指向的字符一直相等,直到str2指向'\0',这时可以知道str1中存在str2字符串,返回的是str1中的str2字串的第一个字符地址;

2.str1和str2指向的字符不全相等,例如下图中,*(str1+1) == *str2,*(str1+2) == *(str2+1),*(str1+3) != *(str2+2),此时指针str2就要返回到字符串str2首字符的地址,而指针str1需要返回到第一次和str2指向的字符相等的后一个位置,即字符串str1中第二个 'b' 的地址。然后又回到一开始的判断。


strcmp部分


strcmp函数是专门用来字符串之间的的比较的

这个比较是比较两个字符串是否相同,如果不相同那就比较两个字符串的长度大小。


int strcmp( const char *string1, const char *string2 );


strcmp函数的参数是两个字符串,返回值为整形


52f5541548d9d9069e710b2a94804b0b_4c846a9cdbdc478cbfb01aa852e24548.png


当如果字符串1与字符串2相等则返回值为0。

如果字符串不一样,并且字符串1>字符串2,则返回值>0。


反之返回值小于零。


strcmp函数比较的是两个字符串不相等的第一个字符的ASCII值。


如果有一方是\0,则非零的字符串较大。


模拟实现strcmp函数


我给出以下两种方法:


#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include<assert.h>
int my_strcmp(char* a, char* b)
{
  assert(a && b);
  while (*a == *b)
  {
  if (*a == '\0')
  {
    return 0;
  }
  a++;
  b++;
  }
  return *a - *b;
}
int main()
{
  char a[10]="abcdef";
  char b[10]="abc";
  if (my_strcmp(a,b) > 0)
  {
  printf("a>b");
  }
  if (my_strcmp(a, b) == 0)
  {
  printf("a==b");
  }
  if(my_strcmp(a,b)==0)
  {
  printf("a<b");
  }
  return 0;
}


int my_strcmp (const char * src, const char * dst)
{
        int ret = 0 ;
 assert(src != NULL);
   assert(dest != NULL);
        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;
        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;
        return( ret );
}


长度受限制的字符串函数


strncpy


char *strncpy( char *strDest, const char *strSource, size_t count );


复制字符串src中的内容到字符串dest中,复制多少由size_t参数的值决定。

如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。

如果n<src的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加'\0',结果dest不包括'\0',需要我们再手动添加一个'\0'。

如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+'\0'。


简单例子


#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
int main()
{
  char a[10]="******";
  char b[10]="chenda";
  strncpy(a, b, 2);
  printf("%s", a);
  return 0;
}


strncat


char *strncat( char *strDest, const char *strSource, size_t count );


#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
int main()
{
  char a[15]="hello \0 ******";
  char b[15]="world";
  strncat(a, b, 6);
  printf("%s", a);
  return 0;
}

如图所示 :


c6be87aec8fb72fc26b550898a0d0420_b995f1c4dbea4c738c21523c2f590219.png


调试过程如图所示。


6e948493b2b9af4dd35b02773e6a2b93_6556c2443ccb4f158af8adc7e3188e24.png


我们可以看到,strncat会自动添加\0,且到\0为止,不会再去将其它字符化为\0。


strncmp


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

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


68aa13d5c56fb47fc4e6857ffa70469a_f6fae92adc754a4695dda5a785043230.png


返回值判断方法和strcmp基本相等。


简单例子


#include <string.h>
#include <stdio.h>
int main()
{
  char a[20]="hello world";
  char b[15]="hello";
  if (strncmp(a, b, 4) == 0)
  {
  printf("相等");
  }
  else
  printf("不相等");
  return 0;
}

88c5fff70d11514acb3eeb504babc077_9d3ba9b1b90045eca16acb6d93a33c6e.png


前五个字符相等。


👉 本菜鸡&总结 👈


这篇博客旨在总结我自己阶段性的学习,要是能帮助到大家,那可真是三生有幸!😀如果觉得我写的不错的话还请点个赞和关注哦~我会持续输出编程的知识的!🌞🌞🌞

958667da4985fd2e6382f7a448958ab0_2961acf9c6587115cd7153e3fbee10cf.gif


相关文章
|
2月前
|
C语言
C语言:字符函数和字符串函数(一篇拿捏字符串函数!)
C语言:字符函数和字符串函数(一篇拿捏字符串函数!)
44 0
|
7月前
|
C语言
【c语言】字符函数与字符串函数(上)
【c语言】字符函数与字符串函数(上)
35 0
|
6月前
|
C语言
C语言学习系列-->字符函数和字符串函数
C语言学习系列-->字符函数和字符串函数
40 0
|
3月前
|
安全 编译器 程序员
C语言之字符函数&字符串函数篇(1)
C语言之字符函数&字符串函数篇(1)
47 0
|
3月前
|
存储 C语言
C语言:字符函数和字符串函数
C语言:字符函数和字符串函数
|
9月前
|
C语言
C语言进阶字符函数和字符串函数(上)
C语言进阶字符函数和字符串函数(上)
50 0
|
9月前
|
C语言
C语言进阶字符函数和字符串函数(下)
C语言进阶字符函数和字符串函数(下)
26 0
|
5月前
|
C语言
C语言 - 字符函数和字符串函数
C语言 - 字符函数和字符串函数
|
6月前
|
C语言 C++
C语言之字符函数&字符串函数篇(2)
C语言之字符函数&字符串函数篇(2)
54 0
|
10月前
|
存储 安全 C语言
玩转字符串函数与字符函数——【C语言】
在C语言的学习中,我们经常会遇到字符串,对它的处理也是数不胜数,但是我们没有很好的处理办法,字符串只能放在字符数组或常量字符串中通过自定义函数去使用处理。而现在我将带领大家学习C语言函数库中专门处理字符串的函数。
38 0