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");
}
时间: 2024-08-02 10:44:46

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

苹果新的编程语言 Swift 语言进阶(十二)--选项链

选项链是使用选项来查询和调用其属性.方法或下标的一个过程,如果选项包含一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在任何类型的选项来检查对其一个属性.方法.下标的查询和调用是否成功. 选项链可以作为强制展开的替代方式使用,但选项链的使用更加安全,不会触发一个运行时错误. 在调用一个选项的属性.方法或下标方法时,通过在该选项值的后面放置一个(?)标记来规定一个选项链.这与在选项值后放置一个(!) 来强制展开选项的值非常相似.主要的不同是在选项值为nil时选项链能够

Python学习之路3 - 字符串操作&amp;字典

本节内容: 常用的字符串处理. 格式化输出字符串. 字符串的替换. 字符串和二进制的相互转化. 字典的操作 字符串操作 常用的字符串处理 name = 'vector' print(name.capitalize()) # 首字母大写 print(name.count('e')) # 判断字符e在字符串中有多少个 print(name.center(50,'-')) # 一共打印50个字符,将vector放在中间,两边用-填充 print(name.endswith('r')) # 判断字符串以

JavaScript进阶之路(二)——变量与基本数据类型

前言 JavaScript中的变量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串.一个变量所保存值的类型也可以改变,这在JavaScript中是完全有效的,只是不推荐.相比较于将变量理解为“盒子“,<JavaScript编程精解>中提到应该将变量理解为“触手”,它不保存值,而是抓取值.这一点在当变量保存引用类型值时更加明显. JavaScript中变量可能包含两种不同的数据类型

【python3的进阶之路二】因特网客户端编程

一.文件传输 1.1 文件传输因特网协议 最流行的协议包括文件传输协议(FTP).UNIX到UNIX复制协议(UUCP).用于Web的超文本传输协议(HTTP).另外,还有(UNIX下的)远程文件复制命令rcp(以及更安全.灵活的scp和rsync). HTTP主要用于基于Web的文件下载以及访问Web服务,一般客户端无须登录就可以访问服务器上的文件和服务.大部分HTTP文件传输请求都用于获取网页(即将网页文件下载到本地). 而scp和rsync需要用户登录到服务器主机.在传输文件之前必须验证客

梓益C语言学习笔记之常用字符串操作(sscanf &amp; strtok)

一.sscanf int sscanf(const char *buf,const char *format, -);  \\从buf指定的内存区域中读入信息 例: int a, b, c; sscanf("2013:10:1", "%d:%d:%d", &a, &b, &c); printf("%d  %d  %d\n",a,b,c); sscanf()的正则表达式是从头向后顺序查找匹配字符,找不到就返回错误,如下面的几

C语言基础 第九章 常用字符串操作函数

sscanf():可以将一个长的字符串按照需求分割成想要的格式 实例: #include<stdio.h> #include<string.h> int main() { //1. 取指定长度的字符串 char str[100]; sscanf("12345","%4s",str); printf("%s\n",str);//1234 //2. 格式化时间 int year, month, day, hour, minut

C语言进阶之路(三)----野指针的产生原因及解决办法

1.会产生野指针的做法 #include <stdio.h> //这就是一种错误的写法 int main(){ int *p = NULL; p = (int *)malloc(4); //释放P所指向的内存空间,但指针变量p仍然留在栈中,成为了野指针 if (p != NULL){ free(p); } if (p != NULL){ free(p); } return 0; } 2.正确的做法: #include <stdio.h>//指针变量和指针所指向的内存变量是两个不同的

python对字符串的常见操作

一.通过索引对字符串切片 切片操作(slice)可以从一个字符串中获取子字符串(字符串的一部分).我们使用一对方括号.起始偏移量start.终止偏移量end 以及可选的步长step 来定义一个分片. 格式: [start:end:step] start默认取值,若step为正数,则默认为0,若step为负数,则默认为-1 end默认取值,若step为正数,则默认为字符串末尾位置,若step为正数,默认为字符串开头位置 step默认是1.正数则向右切片,若为负数则向左切片 例: s = 'abcd

Python的语言基础总结(二)之循环与字符串操作

一.循环和分支 1. 条件分支语句 if 条件: 代码块 else: 代码块 2. 循环语句之while 思考1:求1+2+3+....+10的值 sum = 0 num = 1 while num < 101: sum += num num += 1 print(sum) for 循环 for 语句: 代码块 二.字符串操作 1.字符串的拼接 使用加号进行链接 #字符串的链接,通过"+"进行链接 s1 = 'welcome' s2 = 'to guangzhou' print(