[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)

2023-10-29

[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)

 函数StringSplit(分割字符串到一个字符串数组中,其中该数组第0位为分割后字符串的个数)
 函数StringSplit_Struct(以定义一个新结构的方式来实现该函数)

/*C代码如下*/
#include <stdio.h>

/*实现方案1*/
/*分割字符串到一个字符串数组中,其中该数组第一位为分割后的个数*/
char** StringSplit(const char* string,const char* split)
{
      char** result;
      /*首先分配一个char*的内存,然后再动态分配剩下的内存*/
      result = (char * * )malloc(sizeof(char *)*1);
      memset(result,0,sizeof(char *)*1);
      /*定义一个遍历用的指针和一个寻找位置用的指针*/
      char* p = string;
      char* pos = string;
      /*无论是否存在该分割串,绝对都会分割到一个字符串*/
      int count = 1;
      while(*p != '\0')
      {
          char* temp;
          char* tt;
          /*查找该字符串*/
          pos = strstr(p,split);
          /*结果为0说明剩下的字符串中没有该字符了*/
          if(pos == 0)
          {
            result = (char * * )realloc(result,sizeof(char *)*(count+2));
            result[0] = count;
            result[count] = p;
            result[count+1] = NULL;
            return result;
          }
          /*分配临时字符串空间*/
          temp = (char * )malloc(sizeof(char)*(pos - p+1));
          memset(temp,0,sizeof(char)*(pos - p+1));
          /*设置头指针,以便赋值时使用*/
          tt = temp;
          while(p<=pos)
          {
            *temp++ = *p++;
          }
          /*将字符串结尾置零*/
          *--temp = '\0';
          result = (char * * )realloc(result,sizeof(char *)*(count+1));
          result[0] = count;
          result[count] = tt;
          count++;
          /*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/
          p +=strlen(split)-1;
      }
      return result;
}
/*实现方案2*/
/*为方便计数定义的结构,字符串数组从0开始赋值*/
typedef struct{
      int number;         /*分割的字符串个数*/
      char** string;         /*字符串数组*/
}StringTab;
/*分割字符串到一个字符串数组中*/
StringTab StringSplit_Struct(const char* string,const char* split)
{
      StringTab result;
      /*首先分配一个char*的内存,然后再动态分配剩下的内存*/
      result.string = (char * * )malloc(sizeof(char *)*1);
      memset(result.string,0,sizeof(char *)*1);
      /*无论是否存在该分割串,绝对都会分割到一个字符串*/
      result.number = 0;
      /*定义一个遍历用的指针和一个寻找位置用的指针*/
      char* p = string;
      char* pos = string;
      while(*p != '\0')
      {
         char* temp;
         char* tt;
         /*查找该字符串*/
         pos = strstr(p,split);
         /*结果为0说明剩下的字符串中没有该字符了*/
         if(pos == 0)
         {
           result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));
           result.string[result.number] = p;
           return result;
         }
         /*分配临时字符串空间*/
         temp = (char * )malloc(sizeof(char)*(pos - p+1));
         memset(temp,0,sizeof(char)*(pos - p+1));
         /*设置头指针,以便赋值时使用*/
         tt = temp;
         while(p<=pos)
         {
           *temp++ = *p++;
         }
         /*将字符串结尾置零*/
         *--temp = '\0';
         result.string = (char * * )realloc(result.string,sizeof(char *)*(result.number+1));
         result.string[result.number] = tt;
         /*计数器加一*/
         result.number++;
         /*设置下一次遍历时的指针(重要)。当split长度大于1时,不这样设置会多赋值不必要的字符串*/
         p +=strlen(split)-1;
      }
      return result;
}

int main()
{
      /*进行测试*/
      /*方案1测试*/
      char** array;
      array = StringSplit("a/aaa//哈aa","aaa");
      int i ;
      for(i=1;i<=(int)array[0];i++)
      {
          printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);
      }
    
      array = StringSplit("a/aa哈a//哈aa","哈");
      for(i=1;i<=(int)array[0];i++)
      {
          printf("Num:%d I:%d: Value: %s\n",array[0],i,array[i]);
      }

      /*方案2测试*/
      StringTab array2;
      array2 = StringSplit_Struct("a/aaa//哈aa","aaa");
      for(i=0;i<=array2.number;i++)
      {
         printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);
      }
      array2 = StringSplit_Struct("a/aa哈a//哈aa","哈");
      for(i=0;i<=array2.number;i++)
      {
         printf("Num:%d I:%d: Value: %s\n",array2.number,i,array2.string[i]);
      }

      return 0;
}

 

http://hi.baidu.com/nivrrex/item/8f0c8f175a9ce5721009b5a1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符) 的相关文章

  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • 1000 BASE-T1 PMA一致性测试解析

    车载以太网是为了满足汽车行业对高可靠性 低电磁辐射 低功耗 带宽分配 低延迟以及同步实时性等方面的要求而产生的 目前车载电子控制单元中 最常用的是1000BASE T1技术 其遵循的是IEEE 802 3bp标准规范要求 1000BASE
  • Nginx代理(Linux&Windows)-服务器

    Linux linux一般都是用宝塔面板 一键安装使用 下面是安装完后添加配置就可以指定文件目录了 注意好空格 宝塔阿里云开启端口 宝塔阿里云开启端口 宝塔阿里云开启端口 就okk了 Windows 直接下一个Nginx https pan
  • Angular 和 Flask 全栈简易演示

    对于 JavaScript 框架 MEAN 堆栈以其方式非常有名 我经常遇到项目要求 人们希望使用 Python 构建服务器代码 主要是因为它与物联网 图像处理 数学应用程序或语言选择有关 Django 是 Python 爱好者构建服务器端
  • qt在没有环境下如何运行exe 打包流程-亲测简介可用

    配图 文字流程叙述 0 最好使用release 生成的exe 进行打包 不然最后的文件会特别大几个G 用relese生成的exe打包几十MB 1 用release生成的exe单独复制一份 放入一个自定义的文件夹 2 打开qt编译器命令框 注
  • 计算机网络打不开怎么办,电脑网页打不开怎么回事

    电脑网页打不开怎么回事 电脑网页打不开怎么回事 电脑没有断开网络 却打不开网页 这是怎么回事呢 通常由于电脑的DNS解析出现问题 所以才会导致网页打不开 下面教大家电脑网页打不开怎么回事的解决办法 一 清除DNS解析缓存 关于电脑网页打不开
  • 详细分析vcoco2014HOI数据集

    vcoco images 图片 train2014 共82783张 COCO train2014 000000581921 jpg COCO train2014 000000581922 jpg COCO train2014 0000005
  • 记录ubuntu启动卡在logo界面有鼠标进不了桌面的经历,以及安装ubuntu踩的坑

    出现问题前 我之前安装过很多次ubuntu 不管是虚拟机 4 5次 还是双系统 3 4次 每次都是我自己搞崩的 就是我和之前一样开始安装搜狗输入法 之前没出过问题 然后就是这次安装完 我感觉和之前不一样 就是之前不知道为什么安装完会有pin
  • 波兰表达式 - 前,中,后缀表达式计算转换

    先看一个算术题 3 4 5 6 29 前缀表达式 3456 中缀表达式 3 4 5 6 你会算的 后缀表达式 34 5 6 利用栈的特性来运算表达式 当前我只拿到了 3 4 5 6 让我求它的前缀和后缀 求后缀口诀 1 从左到右看 数字忙显
  • ubuntu 提示 Could not get lock /var/lib/dpkg/lock-frontend.的处理办法

    今天可能操作删除某个程序的时候提示无法删除 给锁定了 一直显示 Waiting for cache lock Could not get lock var lib dpkg lock frontend It is held by proce
  • Optimizer trance—mysql进阶(五十三)

    前面介绍了 如果加个format JOSN会把数据以json的格式返回 如果想看查询的额外信息 还可以在explain之后加个show warning查看 其中如果code为1003 则代表message里的内容是mysql优化器优化之后的
  • Python学习十二:Flask框架

    文章目录 一 Flask 简介 1 1 安装虚拟环境 1 1 1 安装Virtualenv 1 1 2 创建虚拟环境 1 1 3 激活虚拟环境 1 2 安装Flask 1 3 第一个Flask 二 Flask基础 2 1 开启调试模式 2
  • Java测试(1)

    1 什么是软件测试 软件测试就是软件测试人员验证软件是否满足用户的需求 测试的时候要测试满足和不满足的数据 2 软件测试和软件开发的区别 1 本身 开发 广度小 专业度高 测试 所需技能比价广泛 但是专业度低 2 软件测试和软件调式 目的
  • 阿里版GPT来袭——“通义千问”

    4月7日 阿里云在官方公众号中宣布 大模型 通义千问 开始邀请测试 你好 我叫通义千问 在 通义千问 的自我介绍中可知 它是达摩院自主研发的预训练语言模型 能够回答问题 创作文字 还能表达观点 撰写代码 基于上述能力 通义千问 认为其可以在
  • 数据仓库的选择

    author skate time 2010 03 11 数据仓库的选择 数据仓库的选择单从技术方面要从服务器硬件 数据库软件 ETL和前端展示软件 存储系统 仓库的架构设计几方面综合考虑 根据数据库的操作类型不同 数据库一般分为OLAP和
  • ORA-12505, TNS:listener does not currently know of SID given in connect descriptor解决方式

    启动项目连接oracle数据报 ORA 12505 TNS listener does not currently know of SID given in connect descriptor ORA 12505 TNS 监听程序当前无法
  • .NET网站部署到阿里云服务器经验分享

    由于笔者需要将自己的网站上线 所以第一步就是去买了一个阿里云服务器 想要远程访问的话 首先是云数据库的部署 然后是网站的部署 1 云数据库的部署 过程 在云服务器上下载SQLServer 然后把本地的数据库 架构和数据 使用脚本导出保存 再
  • 【千律】OpenCV基础:Hough圆检测

    环境 Python3 8 和 OpenCV 内容 Hough圆检测 将直角坐标系中的一个圆映射为新坐标系中的一个点 对于原直角坐标系中的每一个圆 可以对应 a b r 这样一个点 这个点即为新三维中的点 标准法实现步骤 1 获取原图像的边缘
  • 如果判断服务器是否在被CC攻击?

    什么是CC攻击 CC攻击的前身名为Fatboy攻击 是利用不断对网站发送连接请求致使形成拒绝服务的目的 攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包 造成对方服务器资源耗尽 一直到宕机崩溃 怎么判断是否被CC攻击 CC攻击主要
  • php怎么获取微信code,PHP tp3.2微信公众号静默授权获取code 获取openid

    PHP tp3 2微信公众号静默授权获取code 获取openid 发布时间 2018 02 24 14 46 浏览次数 1530 标签 PHP tp code openid 一 调用静默授权接口 基于thinkphp3 2的 1 获取co
  • [C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)

    C语言 字符串处理 以指定的字符串分割字符串 支持中文字符 函数StringSplit 分割字符串到一个字符串数组中 其中该数组第0位为分割后字符串的个数 函数StringSplit Struct 以定义一个新结构的方式来实现该函数 C代码