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 = ;
char *p = str; int ncout = ;
if (str==NULL || substr== NULL || count==NULL)
{
rv = -;
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 = ;
char *p = "abcd1111abcd222abcd3333";
char *subp = "abcd";
int ncout = ; ret = getCout(p, subp, &ncout);
if (ret != )
{
printf("func getCout() err:%d \n", ret);
return ;
}
printf("coutn = %d \n", ncout);
return ;
}
2.两头堵模型:两种写法
//求去掉两边空格之后的字符串长度,指针作为形参传入,将结果赋值给指针指向的内存
int trimSpaceStr01(char *p, int *mycount)
{
int ret = ; int ncount = ;
int i= , j;
j = strlen(p) - ; while (isspace(p[i]) && p[i] != '\0')
{
i++;
} while (isspace(p[j]) && j>)
{
j--;
} ncount = j - i + ;
*mycount = ncount;
return ret;
} //求去掉两边空格之后的字符串,将指针作为形参传入,将结果赋值给形参指向的内存空间
int trimSpaceStr2(char *p, char *buf)
{
int ret = ; int ncount = ;
int i, j;
i = ;
j = strlen(p) - ; while (isspace(p[i]) && p[i] != '\0')
{
i++;
} while (isspace(p[j]) && j>)
{
j--;
} ncount = j - i + ;
//
strncpy(buf, p + i, ncount);
buf[ncount] = '\0';
return ret;
} //这种写法不好
//不要轻易去改变指针输入特性中in内存块的内存
int trimSpaceStr2_notgood(char *p)
{
int ret = ; int ncount = ;
int i = , j;
j = strlen(p) - ; while (isspace(p[i]) && p[i] != '\0')
{
i++;
} while (isspace(p[j]) && j>)
{
j--;
} ncount = j - i + ; strncpy(p, p + i, ncount);
p[ncount] = '\0';
return ret;
} void main()
{
{
char *p = " abcd ";
char buf[] = { };
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) - ; 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[][], int *num)
{
char *p = NULL;
char *pTmp = NULL;
int ncount = ;
char myBuf[] = { }; //步骤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, , sizeof(myBuf)); //挖字符串
strncpy(myBuf, pTmp, p - pTmp);
myBuf[p - pTmp] = '\0'; strcpy(buf[ncount], myBuf); ncount++;
//步骤3 让p和pTmp重新初始化,达到检索的条件
pTmp = p = p + ;
} } ;
*num = ncount;
return ;
} int spitString02(const char *buf1, char c, char buf[][], int *num)
{
int ret = ;
char *p = NULL;
char *pTmp = NULL;
int ncount = ;
if (buf1 == NULL || num == NULL)
{
return -;
}
//步骤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 + ;
} } ;
*num = ncount;
return ret;
} void main()
{
int ret = , i = ;
const char *buf1 = "abcdef,acccd,";
char c = ',';
char buf[][];
int num = ;
ret = spitString02(buf1, c, buf, &num);
if (ret != )
{
printf("func spitString() err:%d\n", ret);
return ret;
} for (i = ; i<num; i++)
{
printf("%s\n", buf[i]);
} system("pause");
}
C语言进阶之路(二)----字符串操作常见模型的更多相关文章
- GO语言的进阶之路-Golang字符串处理以及文件操作
GO语言的进阶之路-Golang字符串处理以及文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们都知道Golang是一门强类型的语言,相比Python在处理一些并发问题也 ...
- 【php学习之路】字符串操作
无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...
- 小白的Python之路 day2 字符串操作 , 字典操作
1. 字符串操作 特性:不可修改 name.capitalize() 首字母大写 name.casefold() 大写全部变小写 name.center(50,"-") 输出 '- ...
- Python学习之路3 - 字符串操作&字典
本节内容: 常用的字符串处理. 格式化输出字符串. 字符串的替换. 字符串和二进制的相互转化. 字典的操作 字符串操作 常用的字符串处理 name = 'vector' print(name.capi ...
- Go语言核心36讲(Go语言进阶技术十二)--学习笔记
18 | if语句.for语句和switch语句 现在,让我们暂时走下神坛,回归民间.我今天要讲的if语句.for语句和switch语句都属于 Go 语言的基本流程控制语句.它们的语法看起来很朴素,但 ...
- 在R语言中使用Stringr进行字符串操作
今天来学习下R中字符串处理操作,主要是stringr包中的字符串处理函数的用法. 先导入stringr包,library(stringr),require(stringr),或者stringr::函数 ...
- 苹果新的编程语言 Swift 语言进阶(十二)--选项链
选项链是使用选项来查询和调用其属性.方法或下标的一个过程,假设选项包括一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在不论什么类型的选项来检查对其一个属性.方法.下标的 ...
- C语言进阶之路(一)----C语言的内存四区模型
内存四区模型:操作系统给C/C++编写的程序分配内存,通常将分配的内存划分为以下四个区域:1.栈区:存放局部变量,用完由操作系统自动释放2.堆区:动态分配给程序的内存区域,由程序员手动释放3.数据区: ...
- go语言学习之路 二:变量
说道变量,首先应该提一提关键字,因为不能把关键字当做变量来声明. 关键字: 下面列出GO语言的关键字或保留字: break default func interface select case def ...
随机推荐
- mybatis-plus忽略映射字段
mybatis-plus使用对象属性进行SQL操作,经常会出现对象属性非表字段的情况,忽略映射字段使用以下注解: @TableField(exist = false):表示该属性不为数据库表字段,但又 ...
- Win7 SP1 64位 旗舰版 IE8 快速稳定 纯净优化 无人值守 自动激活 20180604
一.系统特色 1.采用微软原版旗舰版定制而成. 2.优化系统服务,关闭一些平时很少使用的服务. 3.精简掉一些无用的东西. 4.系统全程离线制作,不包含任何恶意插件,放心使用. 5.右下角时间加上星期 ...
- 通过灰度线性映射增强图像对比度实现PS中的色阶
通过灰度线性映射增强图像对比度 Halcon中如何通过灰度线性映射增强图片对比度呢?不急,我先讲点其他的. 如果你用过Photoshop,那么想必对增强图像的对比度很熟悉.在Photoshop中,我们 ...
- Sword libcurl回调函数相关知识
libcurl响应回调函数说明 libcurl在默认情况下,回调里面会将数据分段的返回,不会一下子将发送端的数据全部塞到回调函数里面, 经过源码分析回调函数和curl_easy_perform是在 ...
- 遍历一个Set的方法只有一个:迭代器(interator)。
Set-HashSet实现类: 遍历一个Set的方法只有一个:迭代器(interator). HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复. 在O ...
- springboot 工程启动报错之Consider defining a bean of type ‘XXX’ in your configuration.
一.前言: 使用springboot自动注入的方式搭建好了工程,结果启动的时候报错了!!!,错误如下图: Description: Field userEntityMapper in com.xxx. ...
- [转]springboot2 webflux 响应式编程学习路径
原文链接 spring官方文档 springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑 ...
- 使用cnpm 安装vue.js
前提已经安装了node.js 一.临时使用 1.npm install -g cnpm --registry=https://registry.npm.taobao.org 2.cnpm instal ...
- 异步任务神器 Celery-入门
一.Celery入门介绍 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务.比如,在 Web 开发中,对新用户的注册,我们通常会给他 ...
- svn中status为missing的文件的处理方式
svn中status为missing的文件在每次commit时都会出现在待提交的列表里,而且它的上级文件夹前面有个红色的点,有碍观瞻,处理方式也很简单: 1.在待提交的列表里,右击该文件->de ...