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

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

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


相关文章
|
6月前
|
C语言
C语言:字符函数和字符串函数(一篇拿捏字符串函数!)
C语言:字符函数和字符串函数(一篇拿捏字符串函数!)
65 0
|
1月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
5月前
|
编译器 C语言 C++
【C语言基础】:字符函数和字符串函数-2
【C语言基础】:字符函数和字符串函数
|
5月前
|
C语言
【C语言基础】:字符函数和字符串函数-1
【C语言基础】:字符函数和字符串函数
|
6月前
|
安全 Serverless C语言
C语言(10)----字符函数和字符串函数
C语言(10)----字符函数和字符串函数
23 0
|
6月前
|
C语言 存储 编解码
C语言(进阶)—字符函数和字符串函数
C语言(进阶)—字符函数和字符串函数
|
C语言
C语言学习系列-->字符函数和字符串函数
C语言学习系列-->字符函数和字符串函数
53 0
|
C语言
C语言进阶字符函数和字符串函数(下)
C语言进阶字符函数和字符串函数(下)
38 0
|
C语言
C语言进阶字符函数和字符串函数(上)
C语言进阶字符函数和字符串函数(上)
69 0
|
6月前
|
存储 C语言
C语言:字符函数和字符串函数
C语言:字符函数和字符串函数