• 数据结构——C语言实现String字符串操作


    1. #include
    2. #include
    3. #define OK 1
    4. #define ERROR 0
    5. #define TRUE 1
    6. #define FALSE 0
    7. #define Status int
    8. typedef char * string;
    9. //返回串s的元素个数,即串的长度
    10. int StrLength(string s){
    11. if(s != NULL){
    12. int i = 0;
    13. while(s[i] != '\0'){
    14. i++;
    15. }
    16. return i;
    17. }
    18. return 0;
    19. }
    20. //生成一个其值等于字符串常量s的串t
    21. Status StrAssign(string *t,string s){
    22. int len = StrLength(s);
    23. if(len > 0){
    24. *t = (char *)malloc(sizeof(char)*len);
    25. int i = 0;
    26. while(i < len){
    27. (*t)[i] = s[i];
    28. i++;
    29. }
    30. (*t)[i] = '\0';
    31. }
    32. return ERROR;
    33. }
    34. //串s存在,由串s复制得串t
    35. Status StrCopy(string *t, string s){
    36. *t = s;
    37. return OK;
    38. }
    39. //串s存在,将串清空
    40. Status ClearString(string *s){
    41. if(s){
    42. free(*s);//释放后变成野指针,必须置为空指针
    43. *s = NULL;
    44. }
    45. return OK;
    46. }
    47. //若串s为空,返回true,否则返回false
    48. Status StringEmpty(string s){
    49. if(s){
    50. return FALSE;
    51. }
    52. return TRUE;
    53. }
    54. //若s>t,返回值>0,若s=t,返回0,若s
    55. int StrCompare(string s,string t){
    56. int len_s = StrLength(s);
    57. int len_t = StrLength(t);
    58. int i = 0;
    59. while(i < len_s && i < len_t){
    60. if(s[i] == t[i]){
    61. i++;
    62. }else{
    63. return s[i] - t[i];
    64. }
    65. }
    66. return len_s - len_t;
    67. }
    68. //用t返回由s1和s2连接而成的新串
    69. Status StrConcat(string *t,string s1,string s2){
    70. int len_s1 = StrLength(s1);
    71. int len_s2 = StrLength(s2);
    72. int len_t = len_s1 + len_s2;
    73. *t = (string)malloc(sizeof(char)*len_t);
    74. int i = 0;
    75. int j = 0;
    76. int k = 0;
    77. while(i < len_s1){
    78. (*t)[k++] = s1[i++];
    79. }
    80. while(j < len_s2){
    81. (*t)[k++] = s2[j++];
    82. }
    83. (*t)[k] = '\0';
    84. return OK;
    85. }
    86. //串s存在,1 <= pos <= strlength(s),且 0 <= len <= Strlength(s) - pos + 1,用sub返回串S的第pos个字符起长度为len的子串
    87. Status SubString(string *sub,string s,int pos,int len){
    88. *sub = (char *)malloc(sizeof(char) * (len + 1));
    89. int i = 0;
    90. while( i < len && s[i + pos - 1] != '\0'){
    91. (*sub)[i] = s[i + pos - 1];
    92. i++;
    93. }
    94. (*sub)[i] = '\0';
    95. return OK;
    96. }
    97. //串t,s存在,t是非空串,1<=pos<=strlength(s).
    98. //若主串s中存在和串t值相同的子串,则返回它在主串s中第pos个字符之后第一次出现的位置,否则返回0
    99. int Index(string s,string t,int pos){
    100. //朴素模式匹配算法
    101. int i = pos;
    102. int j = 0;
    103. int k = 0;
    104. while(s[i] != '\0'){
    105. k = i;
    106. j = 0;
    107. while(s[k] != '\0' && t[j] != '\0'){
    108. if(s[k] != t[j]){
    109. break;
    110. }
    111. j++;
    112. k++;
    113. }
    114. if(t[j] == '\0'){
    115. return i;
    116. }
    117. i++;
    118. }
    119. return -1;
    120. }
    121. void GetNextVal(string t,int *nextval){
    122. int i,j;
    123. i = 1;
    124. j = 0;
    125. int len = 0;
    126. nextval[1] = 0;
    127. while(t[len] != '\0'){
    128. len++;
    129. }
    130. while(i < len){
    131. if(j == 0 || t[i] == t[j]){
    132. i++;
    133. j++;
    134. if(t[i] != t[j]){
    135. nextval[i] = j;
    136. }else{
    137. nextval[i] = nextval[j];
    138. }
    139. }else{
    140. j = nextval[j];
    141. }
    142. }
    143. }
    144. //获取next数组
    145. void GetNext(string t,int *next){
    146. int len = 0;
    147. int j = 0;
    148. int i = 1;
    149. next[1] = 0;
    150. while(t[len] != '\0'){
    151. len++;
    152. }
    153. while(j < len){
    154. if(j == 0 || t[i] == t[j]){
    155. i++;
    156. j++;
    157. next[i] = j;
    158. }else{
    159. j = next[j];
    160. }
    161. }
    162. }
    163. int IndexKMP(string s,string t,int pos){
    164. int i = pos;
    165. int j = 1;
    166. int next[255];
    167. GetNext(t,next);
    168. int lens = 0;
    169. int lent = 0;
    170. while(s[lens] != '\0' && t[lent] != '\0'){
    171. lens++;
    172. lent++;
    173. }
    174. while(s[lens] != '\0'){
    175. lens++;
    176. }
    177. while(i <= lens && j <= lent){
    178. if(j == 0 || s[i] == t[j]){
    179. i++;
    180. j++;
    181. }else{
    182. j = next[j];
    183. }
    184. }
    185. if(j > lent){
    186. return i - lent - 1;
    187. }else{
    188. return -1;
    189. }
    190. }
    191. //串s,t和v存在,t是非空串。用v替换主串s中出现的所有与t相等的不重叠的子串
    192. string Replace(string s,string t,string v){
    193. int i = 0;
    194. int j = 0;
    195. int k = 0;
    196. int index = Index(s,t,0);
    197. if(index < 0){
    198. return ERROR;
    199. }
    200. int lens = StrLength(s);
    201. int lent = StrLength(t);
    202. int lenv = StrLength(v);
    203. char *newS = (char *)malloc(sizeof(char) * (lens + lenv - lent));
    204. while(i < index){
    205. newS[k] = s[i];
    206. i++;
    207. k++;
    208. }
    209. while(j < lenv){
    210. newS[k] = v[j];
    211. j++;
    212. k++;
    213. }
    214. for(i = index + lent; i < lens; i++){
    215. newS[k] = s[i];
    216. k++;
    217. }
    218. return newS;
    219. }
    220. //串s,t存在,1<=pos<=strlength(s) + 1,在串s的第pos个字符之前插入串t
    221. string StrInsert(string s,int pos,string t){
    222. int lens = StrLength(s);
    223. int lent = StrLength(t);
    224. int i = 0;
    225. int j = 0;
    226. int k = 0;
    227. int index = pos - 1;
    228. string res = (char *)malloc(sizeof(char) * (lens + lent));
    229. while(k < index){
    230. res[i] = s[k];
    231. i++;
    232. k++;
    233. }
    234. while(j < lent){
    235. res[i] = t[j];
    236. j++;
    237. i++;
    238. }
    239. for(k = index;k < lens;k++){
    240. res[i] = s[k];
    241. i++;
    242. }
    243. res[i] = '\0';
    244. return res;
    245. }
    246. //串s存在,1<=pos<=strlength(s) - len + 1.从串s中删除第pos个字符起长度为len的子串
    247. string StrDelete(string s,int pos, int len){
    248. int lent = StrLength(s);
    249. if(len > lent - pos || len <= 0){
    250. return NULL;
    251. }
    252. string res = (char *)malloc(sizeof(char) * (lent - len));
    253. int i = 0;
    254. int k = 0;
    255. while(i < pos){
    256. res[k] = s[i];
    257. i++;
    258. k++;
    259. }
    260. for(i = pos + len ; i < lent; i++){
    261. res[k] = s[i];
    262. k++;
    263. }
    264. res[k] = '\0';
    265. return res;
    266. }
    267. int main(){
    268. string t = NULL;
    269. string s = "I like DataStructure very much!!!";//字符串常量
    270. StrAssign(&t,"I like DataStructure very much!!!");
    271. printf("t = %s\n",t);
    272. t[0] = 'a';
    273. printf("t = %s\n",t);
    274. printf("len = %d\n",StrLength(s));
    275. ClearString(&t);
    276. printf("t = %s\n",t);
    277. StrCopy(&t,s);
    278. printf("t = %s\n",t);
    279. printf("result = %d\n",StringEmpty(t));
    280. t = NULL;
    281. printf("result = %d\n",StringEmpty(t));
    282. t = "hello";
    283. s = ",world.";
    284. printf("s - t = %d\n",StrCompare(s,t));
    285. string s_new;
    286. StrConcat(&s_new,t,s);
    287. printf("_msize = %d\n",_msize(s_new));
    288. printf("%s\n",s_new);
    289. string sub;
    290. string ss = "hello,world.";
    291. SubString(&sub,ss,3,110);
    292. printf("sub = %s\n",sub);
    293. string t_new = "rl.";
    294. int i = Index(ss,t_new,0);
    295. printf("i = %d\n",i);
    296. string sss= "www.hello.world";
    297. string ttt = "hello";
    298. string newsss = Replace(sss,ttt,"aa");
    299. printf("newsss = %s\n",newsss);
    300. string res = StrInsert(sss,2,ttt);
    301. printf("res = %s \n",res);
    302. printf("res = %s\n",StrDelete(sss,3,2));
    303. return 0;
    304. }

  • 相关阅读:
    Guava LongMath类
    彻底了解线程池的原理——40行从零开始自己写线程池
    Linux操作系统安装与gcc和内核升级
    谷歌插件使用&开发
    【Java EE初阶二十八】简单的博客系统
    Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘
    关于Cannot resolve xxx的解决办法
    服务发现原理分析与源码解读
    K8s学习笔记——认识理解篇
    药物与生物大分子的相互关系(分子与药物以及人体关系)
  • 原文地址:https://blog.csdn.net/m0_62780794/article/details/133213931