C语言进阶之路(二)----字符串操作常见模型

1.while模型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//求一个字符串中某个子串出现的次数
int getCout(char *str, char *substr, int *count)
{
    int rv = 0;
    char *p = str;
    
    int ncout = 0;
    if (str==NULL || substr== NULL ||  count==NULL)
    {
        rv = -1;
        printf("func getCout()check (str==NULL || substr== NULL ||  count==NULL) err:%d \n" , rv);
        return rv;
    }
    while (*p != '\0'){
        p = strstr(p, substr);
        if (p == NULL) 
        {
            break;
        }
        else 
        {
            ncout++;
            p = p + strlen(substr);
        }

    } ;
    //通过指针把结果传出来
    *count  = ncout;
    return rv;
}

int main()
{
    int ret = 0;
    char *p = "abcd1111abcd222abcd3333";
    char *subp = "abcd";
    int ncout = 0;

    ret = getCout(p, subp, &ncout);
    if (ret != 0)
    {
        printf("func getCout() err:%d \n", ret);
        return ;
    }
    printf("coutn = %d \n", ncout);
    return 0;
}

 

2.两头堵模型:两种写法

//求去掉两边空格之后的字符串长度,指针作为形参传入,将结果赋值给指针指向的内存
int trimSpaceStr01(char *p, int *mycount)
{
    int ret = 0;

    int ncount = 0;
    int i= 0, j;
    j = strlen(p) - 1;

    while (isspace(p[i]) && p[i] != '\0')
    {
        i++;
    }

    while (isspace(p[j]) && j>0)
    {
        j--;
    }

    ncount = j - i + 1;
    *mycount = ncount;
    return ret;
}

//求去掉两边空格之后的字符串,将指针作为形参传入,将结果赋值给形参指向的内存空间
int trimSpaceStr2(char *p, char *buf)
{
    int ret = 0;

    int ncount = 0;
    int i, j;
    i = 0;
    j = strlen(p) - 1;

    while (isspace(p[i]) && p[i] != '\0')
    {
        i++;
    }

    while (isspace(p[j]) && j>0)
    {
        j--;
    }

    ncount = j - i + 1;
    //
    strncpy(buf, p + i, ncount);
    buf[ncount] = '\0';
    return ret;
}

//这种写法不好
//不要轻易去改变指针输入特性中in内存块的内存
int trimSpaceStr2_notgood(char *p)
{
    int ret = 0;

    int ncount = 0;
    int i = 0, j;
    j = strlen(p) - 1;

    while (isspace(p[i]) && p[i] != '\0')
    {
        i++;
    }

    while (isspace(p[j]) && j>0)
    {
        j--;
    }

    ncount = j - i + 1;

    strncpy(p, p + i, ncount);
    p[ncount] = '\0';
    return ret;
}

void main()
{
    {
        char *p = "     abcd     ";
        char buf[1024] = { 0 };
        trimSpaceStr2(p, buf);
        printf("buf = %s\n", buf);
    }
    
    {
        char *p = "     abcd     ";
        trimSpaceStr2_notgood(p);
        printf("p = %s\n", p);
    }
}

 

3.字符串反转模型

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//将某个字符串逆置
void main()
{
    char p[] = "abcde";
    char c;
    char *p1 = p;
    char *p2 = p + strlen(p) - 1;

    while (p1 < p2)
    {
        c = *p1;
        *p1 = *p2;
        *p2 = c;
        ++p1;
        --p2;
    }

    printf("p:%s \n", p);
}

 

4.两个辅助指针变量挖字符串

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
有一个字符串符合以下特征(”abcdef,acccd,eeee,aaaa,e3eeeee,sssss,";),要求写一个函数(接口),输出以下结果
1)    以逗号分割字符串,形成二维数组,并把结果传出;
2)    把二维数组行数运算结果也传出。
*/

int spitString(const char *buf1, char c, char buf[10][30], int *num)
{
    char *p = NULL;
    char *pTmp = NULL;
    int ncount = 0;
    char myBuf[1024] = { 0 };

    //步骤1 初始化条件 pTmp,p都执行检索的开头
    p = buf1;
    pTmp = buf1;
    while (*p != '\0')
    {
        //步骤2 strstr strchr,会让p后移     在p和pTmp之间有一个差值
        p = strchr(p, c);
        if (p == NULL) //没有找到则跳出来
        {
            break;
        }
        else
        {
            memset(myBuf, 0, sizeof(myBuf));

            //挖字符串
            strncpy(myBuf, pTmp, p - pTmp);
            myBuf[p - pTmp] = '\0';

            strcpy(buf[ncount], myBuf);

            ncount++;
            //步骤3 让p和pTmp重新初始化,达到检索的条件 
            pTmp = p = p + 1;
        }

    } ;
    *num = ncount;
    return 0;
}

int spitString02(const char *buf1, char c, char buf[10][30], int *num)
{
    int ret = 0;
    char *p = NULL;
    char *pTmp = NULL;
    int ncount = 0;
    if (buf1 == NULL || num == NULL)
    {
        return -1;
    }
    //步骤1 初始化条件 pTmp,p都执行检索的开头
    p = buf1;
    pTmp = buf1;
    while (*p != '\0')
    {
        //步骤2 strstr strchr,会让p后移     在p和pTmp之间有一个差值
        p = strchr(p, c);
        if (p == NULL) //没有找到则跳出来
        {
            break;
        }
        else
        {

            //挖字符串
            strncpy(buf[ncount], pTmp, p - pTmp);
            buf[ncount][p - pTmp] = '\0';

            ncount++;

            //步骤3 让p和pTmp重新初始化,达到检索的条件
            pTmp = p = p + 1;
        }

    } ;
    *num = ncount;
    return ret;
}

void main()
{
    int ret = 0, i = 0;
    const char *buf1 = "abcdef,acccd,";
    char c = ',';
    char buf[10][30];
    int num = 0;
    ret = spitString02(buf1, c, buf, &num);
    if (ret != 0)
    {
        printf("func spitString() err:%d\n", ret);
        return ret;
    }

    for (i = 0; i<num; i++)
    {
        printf("%s\n", buf[i]);
    }

    system("pause");
}

 

转载于:https://www.cnblogs.com/crazyzhang/p/5767464.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
系统根据B/S,即所谓的电脑浏览器/网络服务器方式,运用Java技术性,挑选MySQL作为后台系统。系统主要包含对客服聊天管理、字典表管理、公告信息管理、金融工具管理、金融工具收藏管理、金融工具银行卡管理、借款管理、理财产品管理、理财产品收藏管理、理财产品银行卡管理、理财银行卡信息管理、银行卡管理、存款管理、银行卡记录管理、取款管理、转账管理、用户管理、员工管理等功能模块。 文中重点介绍了银行管理的专业技术发展背景和发展状况,随后遵照软件传统式研发流程,最先挑选适用思维和语言软件开发平台,依据需求分析报告模块和设计数据库结构,再根据系统功能模块的设计制作系统功能模块图、流程表和E-R图。随后设计架构以及编写代码,并实现系统能模块。最终基本完成系统检测和功能测试。结果显示,该系统能够实现所需要的作用,工作状态没有明显缺陷。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这者数据之后,管理员就可以进入系统后台功能操作区。进入银行卡列表,管理员可以进行查看列表、模糊搜索以及相关维护等操作。用户进入系统可以查看公告和模糊搜索公告信息、也可以进行公告维护操作。理财产品管理页面,管理员可以进行查看列表、模糊搜索以及相关维护等操作。产品类型管理页面,此页面提供给管理员的功能有:新增产品类型,修改产品类型,删除产品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值