精华内容
下载资源
问答
  • C语言字符串查找函数,字符串中查找子串

    操作系统: Windows10 64位

    运行环境: Visual Studio 10


    依赖的头文件:

    #include <string.h>
    #include <stdlib.h>


    /***************************************************************
    /*	函 数 名:FindSubstring
    /*	函数功能:C语言版,在字符串中查找子串
    /*	参    数:
    /*			  strSource:待查找的源字符串
    /*			  strSub:	 要查找的子串
    /*	返 回 值:
    /*			  返回 0,表示查找成功
    /*			  返回-1,表示查找失败
    /*
    /*	作    者:X攻城狮
    /*	日    期:2015年11月4日
    /***************************************************************/
    int FindSubstring (const char *strSource, const char *strSub)
    {
    	unsigned int uLen = strlen(strSource);
    	if (uLen == 0)
    	{
    		return -1;
    	}
    	char *str1 = (char *)malloc(uLen+1);
    	memset(str1, 0, uLen+1);
    	strcpy(str1, strSource);
    
    	uLen = strlen(strSub);
    	if (uLen == 0)
    	{
    		free(str1);
    		return -1;
    	}
    	char *str2 = (char *)malloc(uLen+1);
    	memset(str2, 0, uLen+1);
    	strcpy(str2, strSub);
    
    	unsigned int i = 0, j = 0;
    	for(i=0; i<=strlen(strSource); i++)
    	{
    		if (str1[i] == str2[j])
    		{
    			j++;
    		}
    		else
    		{
    			if (j == uLen)
    			{
    				break;
    			}
    			else
    			{
    				j = 0;
    			}
    		}
    	}
    
    	free(str1);
    	free(str2);
    
    	if (j == uLen)
    	{
    		return 0;
    	} 
    	else
    	{
    		return -1;
    	}
    }


    展开全文
  • C语言入门:查找子串

    万次阅读 2017-08-12 17:37:47
    查找子串:输入两个字符串s和t,在字符串s中查找子串t,输出起始位置,若不存在,则输出-1.要求自定义函数char* search(char * s,char * t)返回子串t的首地址,若未找到,则返回NULL。试编写相应程序。 #include ...

    查找子串:输入两个字符串s和t,在字符串s中查找子串t,输出起始位置,若不存在,则输出-1.要求自定义函数char*  search(char * s,char * t)返回子串t的首地址,若未找到,则返回NULL。试编写相应程序。


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* search(char*s,char*t)
    {	
    	int size_t=strlen(t),size_s=strlen(s),T,i,j;
    	char *p=NULL;
    	for(i=0;i<=(size_s-size_t);i++)
    	{
    		p=s+i;
    		T=1;
    		for(j=0;j<size_t;j++)
    		{
    			if(*p!=*(t+j))
    			{
    				T=0;
    				break;
    			}
    			p++;
    		}
    		if(T==1)
    			break;
    	}
    	if(T==0)
    		return NULL;
    	else
    		return s+i;
    }
    
    
    
    
    int main()
    {
    	char *s,*t,*p,ch;
    	int count,i;
    	while(1) 
    	{
    		printf("请输入字符串s:(直接输入回车退出)\n");
    		s=(char *)malloc(sizeof(char));       //这里使用动态输入字符串
    		count=0;                //内存足够下可以使字符串字符个数不受数组大小限制
    		while((ch=getchar())!='\n')
    		{
    			s[count]=ch;
    			count++;
    			s=(char *)realloc(s,(count+1)*sizeof(char));
    		}
    		s[count]='\0';
    		if(count==0)                        //程序结束判断
    		{
    			printf("程序运行结束!\n");
    			break;
    		}
    		while(1)                //防止子串输入字符个数超过s的循环
    		{
    			t=(char *)malloc((count+1)*sizeof(char));
    		    printf("输入子串t:\n");
    			i=0;
    		    while((ch=getchar())!='\n')   //循环输入字符来计数
    			{
    				t[i]=ch;
    		    	i++;
    			}
    			t[i]='\0';
    		    if(i>count)
    			{
    				printf("子串t串长>s串长,请重新");
    				t=(char *)realloc(t,i*sizeof(char));   //保证内存成功释放,重新分配t内存
    				free(t);
    			}
    			else
    				break;
    		}
    		if((p=search(s,t))!=NULL)
    		{
    			printf("起始位置:从第%d个字符开始\n",p-s+1);
    	        printf("%s\n\n",p);
    		}
    		else
    		    printf("-1\n\n");     //题目要求没有找到则输出-1
    		free(s); 
    		free(t);
    	}
    	return 0;
    }


     用了malloc和realloc来实现动态内存分配从而实现输入字符个数不再受数组大小限制(内存足够的话),并且考虑到子串t可能因为超出s的个数而出错做了个容错判断,总体上加了循环实现循环输入并设置了一个退出程序出口。这里所有用动态分配的指针全部都及时释放了不会因为循环次数的增多而导致内存占用增大。

     由于realloc动态分配操作较慢,此程序还可以做优化,比如先开辟10字符的空间,每输入10个字符后再多开辟10字符空间,程序运行速度可以比此程序更快。(但对于这么一点可以忽略不计( ̄▽ ̄)~*)

     自定义函数部分使用了从被查找串s第一个字符开始,与t串的字符逐个比较的方法来查找,目前也只能想到了这种查找方法。



    结果:


            




    展开全文
  • 查找str2指向的字符串在str1指向的字符串中首次出现的位置,返回指向该位置的指针。若str2指向的字符串不包含在str1指向的字符串中,则返回空指针NULL。 注意这里必须使用指针而不是数组下标来访问字符...
  • C语言字符串查找函数

    千次阅读 2012-02-11 17:50:31
    //此函数的功能是在一个长字符串中,查找子串 //仅保留,以便使用,请勿见笑! /************************************************************************** ** 此函数的功能是在一个长字符串中,查找子串 **...

    转自:blog.csdn.net/minpro

    //此函数的功能是在一个长字符串中,查找子串
    //仅保留,以便使用,请勿见笑!
    /**************************************************************************
    ** 此函数的功能是在一个长字符串中,查找子串
    ** date : 2008-11-11
    ** env : HP-UX hp94 B.11.11 U 9000/800 4183772791 unlimited-user license
    ***************************************************************************/
    /C语言实现
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    #define PARALENGTH 50

    typedef struct Content_Type_Para{
      char paraName[PARALENGTH];
      char paraValue[PARALENGTH];
    }ContentTypePara_t;

    void setContentType(const char *content)
    {
     //content参数形如"application/bear;params1=XXXYYY,params2=ZZZZSSS"
     char contentTypeName[PARALENGTH];
     char contentTypeValue[PARALENGTH];
      memset(contentTypeName, 0, PARALENGTH);
     memset(contentTypeValue, 0, PARALENGTH);
      int ContentTypeParasNumber = 0;        //参数个数
     ContentTypePara_t contentTypeParas[5];   //参数数组
      for(int k=0; k< 5; k++) 
      { 
       memset(contentTypeParas[k].paraName, 0, PARALENGTH);
      memset(contentTypeParas[k].paraValue, 0, PARALENGTH);
     }
      //在临时空间里操作字符串
     char *p;
     char temp[1024]; 
     memset(temp, 0, sizeof(temp));
     strncpy(temp, content, strlen(content));
     p = temp; 
      
     //临时子串 
      char *tp; 
      char subtemp[PARALENGTH];
     memset(subtemp, 0, PARALENGTH); 
      tp = subtemp;
      char flag;   //用来标识字符串的分割点

      //字符串查找
      for(; *p != '/0'; p++)
      {
      if((*p != '/')&&(*p != ';')&&(*p != '=')&&(*p != ','))   //连续的字符串,复制
      {
       *tp = *p;
       tp++;
      }
       else if(*p =='/')                  //'/'之前的字符串是contentTypeName
       {
       strncpy(contentTypeName, subtemp, strlen(subtemp));
       memset(subtemp, 0, strlen(subtemp));         //清空临时子串
         tp = subtemp;
       flag = '/';                      //标识一个子串的结束
       }
       else if(*p == ';')                 //如果参数之间使用',',那么这个头字段只有一个';'
       {
         if(flag == '/')                  //';'之前的flag一定是'/'
         {
          strncpy(contentTypeValue, subtemp, strlen(subtemp));
          memset(subtemp, 0, strlen(subtemp));
          tp = subtemp;
          flag = ';';
       }
       }
       else if(*p == '=')                  //参数的赋值使用'='
       {
         if((flag == ';') || (flag == ','))
        {
        strncpy(contentTypeParas[ContentTypeParasNumber].paraName, subtemp, strlen(subtemp));
         memset(subtemp, 0, strlen(subtemp));
          tp = subtemp;
          flag = '=';
         }
       }
       else if(*p == ',')
       {
       if(flag == '=')
         {
           strncpy(contentTypeParas[ContentTypeParasNumber].paraValue, subtemp, strlen(subtemp));
           memset(subtemp, 0, strlen(subtemp));
           tp = subtemp;
           flag = ',';
           ContentTypeParasNumber++;
         }
      }
      }
      //最后一个子串
      if(flag == '=')
      {
       strncpy(contentTypeParas[ContentTypeParasNumber].paraValue, subtemp, strlen(subtemp));
      memset(subtemp, 0, strlen(subtemp));
       tp = subtemp;
       ContentTypeParasNumber++;
      }
      else if(flag = '/')                  //没有参数的情况
      {
       strncpy(contentTypeValue, subtemp, strlen(subtemp));
       memset(subtemp, 0, strlen(subtemp));
       tp = subtemp;
     }

      printf("|*|*|***********************************************/n");
      printf("|*|*|contentTypeName : %s /n", contentTypeName);
     printf("|*|*|contentTypeValue : %s /n", contentTypeValue);
      for(int i = 0; i<ContentTypeParasNumber; i++)百思博客3wd-|5CYa&|b
      {
       printf("|*|*|i : %d , para name : %s /n", i, contentTypeParas[i].paraName);
      printf("|*|*|i : %d , para value : %s /n", i, contentTypeParas[i].paraValue);
      }
      printf("|*|*|***********************************************/n");
    }
    void main()
    {
     setContentType("application/bear;params1=XXXYYY,params2=ZZZZSSS");
    }

    /*
    运行结果:
    |*|*|***********************************************
    |*|*|contentTypeName : application                
    |*|*|contentTypeValue : bear                      
    |*|*|i : 0 , para name : params1                  
    |*|*|i : 0 , para value : XXXYYY                  
    |*|*|i : 1 , para name : params2                   
    |*|*|i : 1 , para value : ZZZZSSS                  
    |*|*|***********************************************
    */

    //C++语言实现
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <string>

    bool setContentType(string content)
    {
      //application/bear;boundary=stringXXX
      int contentTypeParaNum = 0;
      string contentTypeName;
     string contentTypeValue_s;
      string contentTypeParaName_s;
     string contentTypeParaValue_s;
      string tempStr = content;

      if(tempStr.size() == 0)
      {
       printf("content-type string is NULL !");
        return false;
      }
      string::size_type pos = tempStr.find_first_of("/");
      contentTypeName = tempStr.substr(0, pos);
      tempStr.erase(0, pos+1);

     pos = tempStr.find_first_of(";");
      contentTypeValue_s = tempStr.substr(0, pos);
      tempStr.erase(0, pos+1);
      
     pos = tempStr.find_first_of("=");
     contentTypeParaName_s = tempStr.substr(0, pos);
      tempStr.erase(0, pos+1);

      contentTypeParaValue_s = tempStr;
      contentTypeParaNum++;

      printf("##################################################/n");
      printf("###contentTypeName : %s /n", contentTypeName.c_str());
      printf("###contentTypeValue_s : %s /n", contentTypeValue_s.c_str());
      printf("###contentType para number : %d /n", contentTypeParaNum);
     printf("###contentTypeParaName_s : %s /n", contentTypeParaName_s.c_str());
      printf("###contentTypeParaValue_s : %s /n", contentTypeParaValue_s.c_str());
     printf("##################################################/n");

      return true;
    }

    int main()
    {
      string content("application/bear;boundary=stringXXX");
     setContentType(content);

      return 0;
    }

    /*

    ##################################################
    ###contentTypeName : application
    ###contentTypeValue_s : bear
    ###contentType para number : 1
    ###contentTypeParaName_s : boundary
    ###contentTypeParaValue_s : string
    ##################################################

    */

    注:虽然很小,但是留下来,以后用的时候随便改改就行了。见笑了^_^

    展开全文
  • c语言——查找子串

    2020-05-16 00:49:32
    c语言——查找子串 int del_substr(char *str, const char *substr); 函数首先判断 substr是否出现在str中,如果并未出现,函数就返回0 如果出现,函数应该把str中该字符串后面的所有字符串赋值到该字符串位置 从而...

    c语言——查找子串

    int del_substr(char *str, const char *substr);
    

    函数首先判断 substr是否出现在str中,如果并未出现,函数就返回0
    如果出现,函数应该把str中该字符串后面的所有字符串赋值到该字符串位置
    从而删除这个字符串,然后函数返回1。如果 substr多次出现在str中,函数只删除第1次出现的字符串

    • a.函数中不使用任何操作字符串的函数.(如: strcpystrcmp等)
    • b.函数中的任何地方不使用下标。

    原理

    利用双指针比较。
    在这里插入图片描述

    例子

    	char *str = "abcdefgdfpoiq";
    	char *sub = "df";
    

    返回

    pos = dfpoiq
    

    代码

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    //查找子串第一次出现的位置
    char* myStrStr(const char *str, const char *substr) {
    	const char *mystr = str;
    	const char *mysub = substr;
    
    	while (*mystr != '\0') {
    
    		if (*mystr != *mysub) {
    			++mystr;
    			continue;
    		}
    
    		//临时指针变量
    		const char *temp_mystr = mystr;
    		const char *temp_mysub = mysub;
    
    		while (*temp_mysub != '\0') {
    
    			if (*temp_mystr != *temp_mysub) {
    				++mystr;//后面的字符不相等,要直接跳过,因为我们已经对比过是不相等的了,没有必要再比较一次。
    				break;
    			}
    			//两字符相等,两指针同时向后走
    			++temp_mysub;
    			++temp_mystr;
    		}
    
    		//说明匹配成功
    		if (*temp_mysub == '\0') {
    			//mystr是const char *类型,这里要强转为char *类型
    			return (char*) mystr;
    		}
    	}
    	return NULL;
    }
    
    void test() {
    	char *str = "abcdefg";
    	char *sub = "f";
    	char *pos = myStrStr(str, sub);
    	printf("pos = %s\n", pos);
    
    }
    
    int main() {
    
    	test();
    
    	system("pause");
    	return EXIT_SUCCESS;
    }
    
    

    运行

    pos = fg
    
    展开全文
  • void revstr(char *str) //字符串反转 int substring(char *res,int pos,int len,char *substr)//从pos开始取len个字符到substr中,返回1成功,0失败 int strindex(char *res,int pos,char *substr) //返回substr在...
  • 6-3 字符串 - 查找子串(pta)

    千次阅读 2020-02-25 21:16:08
    查找子串(BF算法) (10分)C语言标准函数库中包括 strstr 函数,在主查找子串。作为练习,我们自己编写一个功能与之相同的函数。 函数原型 char* StrStr(const char *txt, const char pat); 说明:txt 和 pat ...
  • C语言两个字符串查找最长的公共子串的算法C语言两个字符串查找最长的公共子串的算法完整源码(定义,实现,main函数测试) C语言两个字符串查找最长的公共子串的算法完整源码(定义,实现,main函数测试) #include &...
  • C语言编写代码:完成对任何两个字符串 a和b的连接,并在连接后的字符串查找子串c在母串中首次出现的位置。 要求(1)子串a、b、c从键盘输入;(2)输出母串、子串以及子串在母串中的位置。 ...
  • 字符串查找子串

    2016-03-30 22:31:29
    使用C语言编写程序:1、在字符串查找一个指定的字符第一次出现的位置,并返回字符所在的位置,如果不存在则返回NULL具体实现如下:char*strchr(charconst*str,intch) { char*st=(char*)str; while(st) { if(*...
  • 本题要求实现一个字符串查找的简单函数。 函数接口定义: char *search( char *s, char *t ); 函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。 裁判测试程序样例: #include <...
  • 文章目录一、系统提供的...:在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 ‘\0’。 函数声明: char *strstr(const char *haystack, const char *needle) 参数: haystack:要被检索的...
  • C语言查找字符串

    千次阅读 2017-09-21 00:17:55
    简述使用c语言实现字符串查找子串,返回第一个子串出现的位置。环境 ubuntu16.04 LTS GCC编译器 代码 #include #define N 100 int find_str(char* str1,char* str2) { int i,j,flag=-1; for(i=0,j=0;str1[i]!=...
  • C语言字符串处理的函数扩展,比如实现了子串截取,查找返回index值等
  • 题目:编程实现查找两个字符串的最大公共子串 示例:”aocdfe”和”pmcdfa”最大公共子串为”cdf” 思路: 输入两个字符串,由短字符串的长度决定比较次数。 每次比较一个字符,从短字符串的第一个依次与长字符...
  • 0x00 这一节,我们介绍下常用的C语言字符串处理函数和内存管理函数。 0x01 字符串处理函数: strstr:返回字符串中首次出现子串的地址 详解地址:http://c.biancheng.net/cpp/html/174.html。 strchr:查找某...
  • 6-5 字符串 - 6. 查找子串(BF算法)* (12 分) C语言标准函数库中包括 strstr 函数,在主串中查找子串。作为练习,我们自己编写一个功能与之相同的函数。 函数原型 // 查找子串 char* StrStr(const char *txt, const ...
  • c语言字符串操作函数

    2015-03-28 18:45:45
    字符串查找 查找子字符串 strstr 包含文件:string.h 函数原型:extern char *strstr(char *str, const char *psubstr); 功能:搜索psubstr字符串在另一个字符串str中的第一次出现的位置。 返回值:若psubstr...
  • 编写程序,实现查找两个字符串中的最长公共子串 可直接运行 //1、编写程序,实现查找两个字符串中的最长公共子串; //取next数组中 #include <stdio.h> #include <string.h> void Next(char *T, int *...
  • C语言字符串面试相关函数

    千次阅读 2012-04-09 20:27:10
    第一节、字符串查找 1.1题目描述: 给定一个字符串A,要求在A中查找一个子串B。 如A="ABCDF",要你在A中查找子串B=“CD”。 分析:比较简单,相当于实现strstr库函数,主体代码如下: //在字符串中...
  • C语言标准函数库中包括 strstr 函数,在主查找子串。作为练习,我们自己编写一个功能与之相同的函数。 函数原型 // 查找子串 char* StrStr(const char *txt, const char *pat); 说明:txt 和 pat 分别为主...
  • 自己使用C语言实现的库函数中的strstr函数的功能:代码如下  #include &lt;stdio.h&gt; static const char *strstr_t(const char *str, const char *sub_str) { const char *str_local = NULL; const...
  • strstr():字符串查找子串 ​​strchr():单字符寻找 strcmp():字符串比较 strcpy():字符串拷贝 strcpy函数的原型为:char* strcpy(char* _Dest, const char* _Source); strcpy只有两个参数,即遇到‘\0’...
  • c语言查找两个字符串中的公共子串

    千次阅读 2018-02-24 10:43:25
    代码如下:#include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; void getCommon(char str1[], char str2[], char * str3); int stringLength(char * str)... c...
  • C语言实现字符串查找和替换

    万次阅读 多人点赞 2016-06-02 15:19:42
    常用字处理软件或者编辑器都提供字符串查找和替换功能,本文描述如何借助C语言字符串处理函数来实现字符串查找和替换功能。  先说查找字符串查找主要使用strstr函数,其原型为:char * strstr(char * str...
  • C语言——删除字符串中的指定子串

    千次阅读 2016-12-25 21:20:26
    在给定字符串查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。 要求实现函数:  int delete_sub_str(const char *str, const char *sub_str, char *result_str) 【输入】 str:输入的被操作...
  • 分别遍历两个字符串,一个是外循环,一个是内循环,当内、外循环发现有相同的字符的时候,从当前位置开始匹配common子串,并记录长度,如果长度大于max,则更新最长的公共子串;最后用memcpy将找到的最长公共子串...
  • 查找子串C语言)PTA

    千次阅读 2018-12-23 11:10:21
    本题要求实现一个字符串查找的简单函数。 函数接口定义: char *search( char *s, char *t ); 函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。 裁判测试程序样例: #include ...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 166
精华内容 66
关键字:

c语言字符串查找子串

c语言 订阅