用C语言来分割字符串

相关:http://www.cnblogs.com/roucheng/p/cfenge.html

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

#include <stdio.h>  
int main()  
{  
    char str1[10] = {0};  
    char str2[10] = {0};  
    char str3[10] = {0};  
    sscanf("1,2,3#3,4#4,5","%[^#]#%[^#]#%[^#]", str1, str2,str3);  
    printf("The split result is:\n%s\n%s\n%s\n",str1, str2,str3);  
    return 0;  
}  /* 何问起 hovertree.com */
//[C语言]字符串处理 - 以指定的字符串分割字符串(支持中文字符)  
  
//2008-11-8: 函数StringSplit(分割字符串到一个字符串数组中,其中该数组第0位为分割后字符串的个数)  
//2008-11-10: 函数StringSplit_Struct(以定义一个新结构的方式来实现该函数)  
/*C代码如下*/  
#include <stdio.h>  
  
/*实现方案1*/  /* 何问起 hovertree.com */
/*分割字符串到一个字符串数组中,其中该数组第一位为分割后的个数*/  
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*/  /* 何问起 hovertree.com */
/*为方便计数定义的结构,字符串数组从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()  
{  
     /*进行测试*/ /* 何问起 hovertree.com */ 
     /*方案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://www.cnblogs.com/roucheng/p/cfenge.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120345.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSP程序设计作业

    JSP程序设计作业JSP页面由哪几种主要元素组成?四种元素:普通的HTML标记JSP注释JAVA脚本元素,包括声明、JAVA程序片和JAVA表达式​JSP标记,如指令标记,动作标记和自定义标记。如果有3个用户访问一个JSP页面,该页面中的Java程序片将被执行几次?三次<%!和%>之间声明的变量与<%和%>之间声明的变量有何不同?<%!和%>之间声明的变量在整个JSP页面内都有效,称为JSP页面的成员变量,成员变量的有效范围与标记符号<%!,%…

    2022年6月25日
    30
  • 【Tensorflow2.0】Tensorflow2.x的安装教程

    【Tensorflow2.0】Tensorflow2.x的安装教程anaconda可以使tensorflow的安装变的简单昨天tensorflow开发者大会刚开完,会上发布了关于TensorFlow2.0,TensorFlowLite,TensorFlow.js,SwiftforTensorFlow,TFX等产品生态体系的最新更新和首次发布的内容,2019年任会支持tensorflow1.x,但是我们相信,版本的升级会带来易用性和使用性能的提升…

    2022年6月26日
    25
  • Spring Boot 2 学习笔记(1 / 2)[通俗易懂]

    Spring Boot 2 学习笔记(1 / 2)[通俗易懂]01、基础入门-SpringBoot2课程介绍SpringBoot2核心技术SpringBoot2响应式编程学习要求-熟悉Spring基础-熟悉Maven使用环境要求Java8及以上Maven3.3及以上学习资料SpringBoot官网SpringBoot官方文档本课程文档地址视频地址1、视频地址2源码地址02、基础入门-Spring生态圈Spring官网Spring能做什么Spring的能力Spring的生态覆盖了:w

    2022年8月12日
    7
  • 代码审计感想_代码审计是什么

    代码审计感想_代码审计是什么代码审计感想代码审计内容代码审计工具漏洞扫描漏洞扫描有以下四种检测技术:代码审计内容代码审计(Codeaudit)是一种以发现程序错误,安全漏洞和违反程序规范为目标的源代码分析。软件代码审计是对编程项目中源代码的全面分析,旨在发现错误,安全漏洞或违反编程约定。它是防御性编程范例的一个组成部分,它试图在软件发布之前减少错误。C和C++源代码是最常见的审计代码,因为许多高级语言(如Pyt…

    2025年7月7日
    3
  • Java 数组在内存中的存储 数组的常见操作

    Java 数组在内存中的存储 数组的常见操作Java 数组在内存中的存储数组的常见操作

    2025年6月29日
    2
  • 虚拟机进入桌面命令_win7命令激活系统

    虚拟机进入桌面命令_win7命令激活系统一、NeoKylin系统基础命令1.1关机、重启和登出命令shutdown-hnow立即关闭系统init0关闭系统shutdown-tseconds按预定时间关闭系统shutdown-rnow立即重启reboot重启logout注销1.2系统相关信息date显示系统时间arch和uname-m显示处理器架构uname-r显示正在使用的内核版本cat/proc/cpuinfo查看cpu相关信息…

    2022年8月10日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号