1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 typedef struct 6 { 7 char* ch; 8 int len; 9 }HString; 10 11 void Assign(HString* A, const char* a);//赋值串 12 void Put(HString* A); 13 void Insert(HString* A, int pos, const HString B); 14 void Delete(HString* A, int pos, int len); 15 void Cat(HString* A, const HString B); 16 void Sub(HString* A, int pos, int len, HString* B); 17 18 int main(void) 19 { 20 int pos;//插入位置 21 int len; 22 HString A = { NULL, 0 }; 23 HString B = { NULL, 0 }; 24 char a[] = "hello world!"; 25 char b[] = "hi!"; 26 27 Assign(&A, a); 28 Assign(&B, b); 29 Put(&A); 30 Put(&B); 31 32 printf("请输入要插入的位置\n"); 33 scanf("%d", &pos); 34 Insert(&A, pos, B); 35 Put(&A); 36 37 printf("\n请输入要删除的位置和长度(逗号分隔)\n"); 38 scanf("%d,%d", &pos, &len); 39 Delete(&A, pos, len); 40 Put(&A); 41 42 printf("\n正在连接A和B\n"); 43 Cat(&A, B); 44 Put(&A); 45 46 printf("\n请输入子串在主串的位置和长度(逗号分隔)\n"); 47 scanf("%d,%d", &pos, &len); 48 Sub(&A, pos, len, &B); 49 Put(&B); 50 51 system("pause"); 52 return 0; 53 } 54 55 void Assign(HString* A, const char* a) 56 { 57 int i = 0; 58 while (a[i] != '\0') 59 { 60 i++; 61 } 62 A->len = i;//串A的长度等于串a的长度 63 if (A->len != 0) 64 { 65 if (A->ch != NULL) 66 { 67 free(A->ch); 68 } 69 if (NULL == (A->ch = (char*)calloc(A->len, sizeof(char))))//空间开辟失败 70 { 71 printf("\nclear and allocation fail !\n"); 72 exit(-1); 73 } 74 for (i = 0; i < A->len; i++) 75 { 76 A->ch[i] = a[i]; 77 } 78 } 79 else//当串A长度为0时,串A为空串 80 { 81 A->ch = NULL; 82 } 83 } 84 85 void Put(HString* A) 86 { 87 int i; 88 printf("串值为:"); 89 for (i = 0; i < A->len; i++) 90 { 91 printf("%c", A->ch[i]); 92 } 93 printf("\n"); 94 } 95 96 void Insert(HString* A, int pos, const HString B) 97 { 98 int i; 99 char* temp; 100 if (pos < 0 || pos > A->len + 1) 101 { 102 printf("\n插入位置不合法!\n"); 103 exit(-1); 104 } 105 pos = pos - 1;//数组下标从0开始 106 if (NULL == (temp = (char*)calloc(A->len + B.len, sizeof(char)))) 107 { 108 printf("\nclean and callocation fail !\n"); 109 exit(-1); 110 } 111 for (i = 0; i < pos; i++)//把A串pos之前的字符赋给temp 112 { 113 temp[i] = A->ch[i]; 114 } 115 for (i = pos; i < pos + B.len; i++)//把temp之间部分赋成串B的内容 116 { 117 temp[i] = B.ch[i - pos]; 118 } 119 for (i = pos + B.len; i < A->len + B.len; i++)//把原pos之后的内容连接 120 { 121 temp[i] = A->ch[i - B.len]; 122 } 123 free(A->ch); 124 A->ch = temp; 125 A->len = A->len + B.len; 126 } 127 128 void Delete(HString* A, int pos, int len) 129 { 130 int i; 131 char* temp; 132 if (pos < 1 || pos > A->len || len < 1 || len > (A->len - pos + 1)) 133 { 134 printf("%d", len); 135 printf("\n删除参数不合法!\n"); 136 exit(-1); 137 } 138 pos = pos - 1; 139 if (NULL == (temp = (char*)calloc(A->len - len, sizeof(char*)))) 140 { 141 printf("\nclean and callocation fail !\n"); 142 exit(-1); 143 } 144 for (i = 0; i < pos; i++)//把A串pos之前的字符复制给temp 145 { 146 temp[i] = A->ch[i]; 147 } 148 for (i = pos; i < A->len - len; i++)//把A串删除部分字符后,剩余部分字符复制给temp 149 { 150 temp[i] = A->ch[i + len]; 151 } 152 free(A->ch); 153 A->ch = temp; 154 A->len = A->len - len; 155 } 156 157 void Cat(HString* A, const HString B) 158 { 159 int i; 160 if (NULL == (A->ch = (char*)realloc(A->ch, (A->len + B.len) * sizeof(char))))//函数realloc保留了串A原有的字符内容 161 { 162 printf("\nreset allocation fail !\n"); 163 exit(-1); 164 } 165 for (i = A->len; i < A->len + B.len; i++) 166 { 167 A->ch[i] = B.ch[i - A->len]; 168 } 169 A->len = A->len + B.len; 170 } 171 172 void Sub(HString* A, int pos, int len, HString* B) 173 { 174 int i; 175 if (pos < 1 || pos > A->len + 1 || len < 1 || len > A->len - pos + 1) 176 { 177 printf("\n求子串参数不合法!\n"); 178 exit(-1); 179 } 180 pos = pos - 1; 181 B->len = 0; 182 if (B->ch != NULL)//清空子串 183 { 184 free(B->ch); 185 } 186 if (NULL == (B->ch = (char*)calloc(len, sizeof(char)))) 187 { 188 printf("\nclean and allocation fail !\n"); 189 exit(-1); 190 } 191 for (i = pos; i < pos + len; i++) 192 { 193 B->ch[i - pos] = A->ch[i]; 194 } 195 B->len = len; 196 }