龙空技术网

C\C++语言23|字符串函数的自定义

小智雅汇 314

前言:

眼前我们对“c语言定义一组字符串”都比较注意,小伙伴们都需要知道一些“c语言定义一组字符串”的相关资讯。那么小编也在网络上汇集了一些对于“c语言定义一组字符串””的相关文章,希望咱们能喜欢,我们快快来了解一下吧!

C标准库中提供了<string.h>,里面实现了绝大多数字符串需要的操作:

1) strcpy(s1, s2);

复制字符串 s2 到字符串 s1。

2) strcat(s1, s2);

连接字符串 s2 到字符串 s1 的末尾。

3) strlen(s1);

返回字符串 s1 的长度。

4) strcmp(s1, s2);

如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。

5) strchr(s1, ch);

返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。

6) strstr(s1, s2);

返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。

……

这就是库接口和数据抽象的优势,作为库使用者,我们无需知悉库开发者对接口的内部实现。

对于C风格字符格,一般的推荐做法是,除非特殊需要,尽量选择C++的string类,这样更安全。

虽然我们有了现成的库可以使用,但了解其内部实现,无疑会让我们使用起来更得心应手,同时,也能让我们更熟悉和理解C的相关语法机制。

1 求字符串长度

#include <stdio.h>int length(char *p){	int n=0;	while(*p!='\0')	{		n++;		p++;	}	return n;}int Strlen(const char* str){	int i=0;	while(str[i])		++i;	return i;}int main(){	int len;	char *str[100];	printf("please input a string:\n");	gets(str);	len = Strlen(str);	printf("the string has %d character.",len);	system("pause");	return 0;}

也可以使用递归的方法:

int mystrlen1(const char *str)	//递归{	return (*str !='\0') ? (1+mystrlen1(++str)) : 0;}
2 字符串拷贝
#include <stdio.h> #include <string.h> /*==================================================================函数功能:将字符数组str2复制给一个空字符数组函数输入:空字数数组str1、字符数组str2函数输入:str1====================================================================*/char * mystrcpy(char *str1,const char *str2){ char *p = str1; if(p == NULL || str2 == NULL) { printf("The string is error!\n"); /*非法的字符串拷贝*/ exit(0); } while(*str2 != '\0') /*实现字符串的拷贝*/ { *p = *str2; p++; str2++; } *p = '\0'; /*向字符串str1中添加结束标志*/ return str1; /*返回目的字符串的头指针*/}void main() {	char str1[20];	char * str2 = "Hello World";	printf("str2 string:%s\n",str2);	printf("str1 string:%s\n", mystrcpy(str1,str2));	system("pause");}/*str2 string:Hello Worldstr1 string:Hello World*/
3 字符串连接

3.1 算法1

#include <stdio.h>#include <stdlib.h>#include <string.h>char* Strcat(char *str1,char *str2){		int size_str1;	int size_str2;	int size;	char *tempt,*result;	size_str1=sizeof(str1);	size_str2=sizeof(str2);	size = size_str1 + size_str2 -4;	tempt = (char*)malloc(sizeof(size));	result = tempt;	while(*str1!='\0')	{		*tempt=*str1;		tempt++;		str1++;	}		while(*str2!='\0')	{		*tempt=*str2;		tempt++;		str2++;	}		//*tempt += '\0';	//不能是+=	*tempt = '\0';		//*tempt = 0;	//也行	return result;}int main(){	char *a = "hello";	char *b = ",everyOne!";	printf("string a: %s\n",a);	printf("string b: %s\n",b);	printf("字符串连接后变为:\n");	printf("%s\n",Strcat(a,b));	printf("\n");	system("pause");	return 0;}/*string a: hellostring b: ,everyOne!字符串连接后变为:hello,everyOne!*/

3.2 算法2

#include <stdio.h>#include <stdlib.h>void scat(char* p,char const* q){	while(*p)	{		p++;	}	while(*q)	{		*p = *q;		p++;		q++;	}	*p = 0;}int main(){	char a[32];	a[0] = 0;	scat(a, "hello");	scat(a, " world");	printf("%s\n",a);	system("pause");	return 0;}//hello world
4 在字符串中查找字符
#include "stdio.h"#include "string.h"char *mystrstr(const char *str1, const char *str2){ char *src,*sub;	 if(str1 == NULL || str2 == NULL) { printf("The string is error!\n"); exit(0); } while(*str1 != '\0') { src = str1; sub = str2; do 	 {			 if(*sub == '\0')			 {				 return str1; 		/*找到子串*/			 }		 }		 while(*src++ == *sub++);		 str1++; } return NULL;}void main() {	char * str1 = "This is a test,how to find!";	char * str2 = "test", * pos;	printf("str1: \t\t%s\n",str1);	printf("str2: \t\t%s\n",str2);	pos = mystrstr(str1,str2);	if (pos != NULL) {		printf("The substring: \t%s\n",pos);	} else {		printf("No this substring\n");	}	system("pause");}/*str1: This is a test,how to find!str2: testThe substring: test,how to find!*/
5 计算某个字符在字符串中出现的次数
#include <iostream>using namespace std;int chrcnt(const char* str, int letter){	int n=0;	while(*str)	{		if(*str==letter)			++n;		str++;	}	return n;}void main(){	char* str ="wwuhnwu";	cout<<str<<endl;	cout<<chrcnt(str,'w')<<endl;	 system("pause");}/*wwuhnwu3*/
6 字符串比较
#include <stdio.h> #include <string.h> int mystrcmp(const char *str1,const char *str2){	if(str1==NULL || str2==NULL)	{		printf("The string is error!\n");		/*非法的字符串比较,程序终止*/		exit(0);	}	while(*str1!='\0' && *str2!='\0' && *str1 == *str2)	{		str1++;			/*将两个字符串从头开始逐个字符进行比较*/		str2++;	}		if(*str1 != '\0' && *str2 == '\0')	{		return 1;		/*字符串str2已经比较到了结尾,而字符串str1还没有到结尾*/	}	else if(*str1 == '\0' && *str2 != '\0')	{		return -1;		/*字符串str1已到结尾,而字符串str2还没有到结尾*/	}	else if(*str1 > *str2) 	{		return 1;		/*字符串str1中的字符大于str2中的字符*/	}	else if(*str1 < *str2)	{		return -1;		/*字符串str1中的字符小于str2中的字符*/	}	return 0;			/*字符串相等,返回0*/}void main() {	char str1[20], str2[20];	printf("请输入第一个字符串:\n");	scanf("%s",str1);	printf("请输入第二个字符串:\n");	scanf("%s",str2);	if (strcmp(str1,str2)>0) {		printf("%s > %s\n", str1,str2);	} else if(strcmp(str1,str2)<0) {		printf("%s < %s\n", str1,str2);	} else {		printf("%s = %s\n", str1,str2);	}	system("pause");}/*请输入第一个字符串:wwu请输入第二个字符串:wwuhnwwu < wwuhn*/
7 字符数组按倒序输出
#include "stdio.h"#include "string.h"/*=================================================================================函数功能:将一个字符数组按字符倒序输出,如"I am a student",输出为"tneduts a ma I";函数输入:字符数组指针、起点(0)、终点(长度-1);函数输出:1表示成功,0表示出错;=================================================================================*/int reverseStr(char *str,int begin,int end){ char tmp; if(str == NULL) { return 0;  } if(begin<end) { tmp = str[begin]; str[begin] = str[end]; str[end] = tmp; reverseStr(str,begin+1,end-1); } return 1;}/*=================================================================================函数功能:函数功能:将一个字符数组中的每一个单词中的字符倒序输出,如"tneduts a ma I",输出为"I am a student";函数输入:字符数组指针;函数输出:1表示成功,0表示出错;=================================================================================*/int reverseWords(char *str){ int wordBegin=0, wordEnd=0, len=0; if(str == NULL || *str == '\0') { return 0;	 }	len = strlen(str); reverseStr(str,0,len-1); while(wordEnd<len) {		if (str[wordEnd] != ' ') {		 wordBegin=wordEnd;		 while(str[wordEnd]!=' ' && str[wordEnd]!='\0' && wordEnd<len)		 {				wordEnd++;		 }		 wordEnd--;		 reverseStr(str,wordBegin,wordEnd);		} wordEnd++;	}	return 1; 		}main(){	char str[20] = "I am a student" ; printf("%s\n",str);	reverseStr(str,0,strlen(str)-1);		printf("%s\n",str);	reverseStr(str,0,strlen(str)-1); reverseWords(str); printf("%s\n",str); system("pause");}/*I am a studenttneduts a ma Istudent a am I*/
8 从字符串的指定位置删除指定长度的子串
#include "stdio.h"#include "string.h"/*=========================================================函数功能:从字符串的指定位置删除指定长度的子串函数输入:字符数组指针、删除位置、长度函数输出:1表示成功,0表示错误==========================================================*/int delChars(char *str,int pos,int len){	int strLength,i,j; if(str == NULL) return 0;			/*有效性判断*/ strLength = strlen(str); if(pos+len-1 > strLength || len<0 || pos<=0) { printf("Delete error\n");		/*有效性判断*/ return 0; }	 i = pos - 1; j = pos + len - 1; while(str[j]!='\0' && j<strLength) { str[i] = str[j];		/*删除第pos以后的len个字符*/ j++; i++; } str[strLength-len] = '\0';	/*添加字符串结束标志*/ return 1;					/*操作成功*/}main(){ char str[20] = "abcdefg"; printf("The string is %s\n",str); delChars(str,3,3); printf("The string after delChars is %s\n",str); getchar();}/*The string is abcdefgThe string after delChars is abfg*/
9 在字符串中查找某字符串
#include <iostream>using namespace std;char* strchr(char* str, int letter){	while((*str!=letter)&&(*str))		str++;	return str;}void main(){		char* str="wwuhnwu";	cout<<strchr(str,'h')<<endl;	cout<<str<<endl; system("pause");}/*hnwuwwuhnwu*/

-End-

标签: #c语言定义一组字符串 #c语言中stringh用法