更多精彩文章请关注公众号『大海的BLOG』

字符串处理函数

1.简介

  • 在c语言的学习过程中,我们会学习很多字符串处理函数,入strlen,strcpy,strcmp等等,使用也特别简单,只需要调用库函数就行。
  • 但是对于c语言初学者来说,作为一个面向过程的语言,了解其函数内的实现过程还非常用必要的。

2.字符串实现函数

strcpy(字符串拷贝函数)

#include <stdio.h>
#define M 50
//指针函数 返回值为指向字符串str1的指针
char *strcpy(char * str1, const char * str2 )
{
    //判断 是否为空指针
    if(str1 == NULL || str2 == NULL)
    {
        return NULL;
    }
    char *p = str1;
    while((* str1++ = * str2++) != '\0');
    return p;
}

int main()
{
    char str1[M]={0};
    char str2[M]={0};
    printf("please input str1\r\n");
    fgets(str1,50,stdin);
    char *p = strcpy(str2,str1);
    puts(str2); 
    return 0;
}

运行结果
运行1

注意:fgets输入的时候会将缓存区里面的回车换行

作为笔试题考察点有四处

  1. 异常处理 str1,str2 是否为NULL
  2. const 的修饰,str2不能被修改需要const来修饰
  3. 字符串会拷贝 ‘\0’
  4. 返回值(指向str2的指针),可以方便调用者调用

strcmp(字符串比较大小)

**#include <stdio.h>
#define M 50
#define N 50
int Strcmp(const char *str1,const char *str2);
int main()
{
    //输入两个字符串
    char str1[M]={0};
    char str2[N]={0};
    printf("please input str1\r\n");
    scanf("%s",str1);
    printf("please input str2\r\n");
    scanf("%s",str2);
    //比较两字符串的大小
    Strcmp(str1,str2);
    return 0;
}

int Strcmp(const char *str1,const char *str2)
{
    //判断 是否为空指针
    if(str1 == NULL || str2 == NULL)
     {
          return;
     }
    int i=0;
    while(*(str1+i)==*(str2+i) && *(str1+i)!='\0')
    {
        i++;
    }
    if( *(str1+i)>*(str2+i) ) 
    {
        printf("str1>str2\r\n");
        return 1;
    }
    else if( *(str1+i) < *(str2+i) )
    {
        printf("str1<str2\r\n");
        return -1;
    }
    else
    {
        printf("str1=str2\r\n");
        return 0;
    }
}

运行结果
运行2
作为笔试题考点同上

strcat (字符串拼接函数)

#include <stdio.h>
#include <string.h>
#define M 50
#define N 50
char *str_cat(char*,char*);

int main()
{
    char str1[M]={0};
    char str2[N]={0};
    //输入两个字符串
    printf("please input str1\r\n");
    scanf("%s",str1);
    printf("please input str2\r\n");
    scanf("%s",str2);
    char *p=str_cat(str1,str2);
    puts(p);
    return 0;
}

//字符串拼接
char *str_cat(char *str1,char *str2)
{
    //判断 是否为空指针
     if(str1 == NULL || str2 == NULL)
      {
            return;
      }
      //字符串str1的长度
     int j=strlen(str1);
     //字符串str2的长度
     int k=strlen(str2);
    if( M < (j+k) )
    {
        return ;
    }
    //定义两个指针
    char *pp=str1;
    char *p=str1+j;
    char *q=str2;
    int i=0;
    for(i=0;i<k;i++)
    {
        *(p+i) = *(q+i);
    }
    return pp;
}

运行结果
运行3

strlen(求字符串的长度)

#include <stdio.h>
int mystrlen(char *pStr);
int main()
{
    char str[100] ={0};
    printf("please input str\r\n");
    scanf("%s",str);
    //用变量a来接受函数的返回值
    int a=mystrlen(str);
    printf("%d\r\n",a);
    return 0;
}

//求字符串的长度
int mystrlen(char *pStr)
{
    if(NULL==pStr)
    {
        return -1;
    }
    int i=0;
    while(pStr[i] !='\0')
    {
        i++;
    }
    return i;
}

运行4

注意:strlen 和 sizeof的区别

  • strlen 计算字符串的长度,不计算字符串的结束标识符 ‘\0’
  • sizeof 计算的是占空间的大小会计算进去

字符串的翻转

*方法一 *

#include <stdio.h>
#include <string.h>
#define n 50

int main()
{
    //输入字符
    char arr[n]={0};
    scanf("%s",arr);
    char *p=arr;
    char *q=&arr[strlen(arr)-1];
    int i=0;
    //用指针p指向首地址,q指向字符的尾地址
    for(i=0;i<strlen(arr)/2;i++)
    {    
        char tmp= *(p+i);
         *(p+i)=*(q-i);
         *(q-i)=tmp;
    }
    puts(arr);
    return 0;
}

运行5
方法二

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

int main()
{
    char str[100]={0};
    gets(str);
    char *p=str;
    char *q=str+strlen(str)-1;

    while(p<q)
    {
        int tmp=*p;
        *p=*q;
        *q=tmp;
        p++;
        q--;
    }
    puts(str);
    return 0;
}

字符串的查找

编写一个字符串查找函数,函数原型为:
char *str_search(const char *str1, const char *str2),
该函数实现在字符串str1中找出字符串str2第一次出现的位置。
如果str2出现在str1中,则返回str2在str1中出现的首地址,
如果在str1中没有与str2匹配的字符串则返回NULL

#include <stdio.h>
#include <string.h>
char *str_search( char *str1, char *str2 );

int main()
{
    //定义两个字符串
    char str1[20] = {0};
    char str2[20] = {0};
    //赋值
    scanf("%s",str1);
    scanf("%s",str2);
    char *q = str_search(str1,str2);
    printf("%s\r\n",q);
    return 0;
}

char *str_search( char *str1, char *str2 )
{
    //定义一个指针指向 str1
    char *p = str1;
    //逐个移动比较
    int i = 0;
    for( i=0; i < strlen(str1); i++ )
    {
        char tmp = *( p+strlen(str2)+i );
        *( p+strlen(str2)+i ) = '\0';
        //比较两个字符串
        if( 0 == strcmp( str1+i, str2 ) )
        {
            return p+i;
        }    
        *( p+strlen(str2)+i ) = tmp;
    }
    return NULL;
}    

运行6

更多精彩文章请关注公众号『大海的BLOG』


学习中...