汉扬编程 编程大纲 C\\C++语言23|字符串函数的自定义

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

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 world4 在字符串中查找字符#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-

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6451.html

C语言判断字符串是否为数字

C语言100题集合019-实现输入一个星期中对应的第几天

发表评论

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

返回顶部