C语言实现字符串基本操作 - 赋值、长度、比较、连接、子串、插入、替换、定位
#include <stdio.h> #include <stdlib.h> #include <string.h> #define ERROR 0 #define OK 1
typedef int Status; typedef struct { char *ch; int length; } HString;
Status StrAssign(HString *S); Status StrLength(HString S); Status StrCompare(HString S1, HString S2); Status StrConcat(HString *S, HString S1, HString S2); HString SubStr(HString *S, HString S1, int pos, int len); Status StrDelete(HString *S, int pos, int len); Status Replace(HString *S, HString S1, HString S2); Status StrLocate(HString S, HString T);
int main() { HString S, S1, S2; int choice, pos, len;
while (1) {
system("cls");
printf("
"); printf(" 1:串赋值 "); printf(" 2:求串长 "); printf(" 3:串比较 "); printf(" 4:串连接 "); printf(" 5:求子串 "); printf(" 6:子串插入 "); printf(" 7:子串置换 "); printf(" 8:子串定位 "); printf(" 9:退出 "); printf(" 请输入您的选择(1-9)=:");
scanf("%d", &choice);
if(choice==9) break;
switch (choice) {
case 1:
system("cls");
printf("请输入字符串:");
StrAssign(&S);
printf("赋值后的串为:%s\n", S.ch);
system("pause");
break;
case 2:
system("cls");
printf("串的长度为:%d\n", StrLength(S));
system("pause");
break;
case 3:
system("cls");
printf("请输入第一个字符串:");
StrAssign(&S1);
printf("请输入第二个字符串:");
StrAssign(&S2);
if (StrCompare(S1, S2) == 0) {
printf("两个字符串相等\n");
} else {
printf("两个字符串不相等\n");
}
system("pause");
break;
case 4:
system("cls");
printf("请输入第一个字符串:");
StrAssign(&S1);
printf("请输入第二个字符串:");
StrAssign(&S2);
StrConcat(&S, S1, S2);
printf("连接后的字符串为:%s\n", S.ch);
system("pause");
break;
case 5:
system("cls");
printf("请输入要求子串的字符串:");
StrAssign(&S1);
printf("请输入子串的起始位置:");
scanf("%d", &pos);
printf("请输入子串的长度:");
scanf("%d", &len);
SubStr(&S, S1, pos, len);
printf("子串为:%s\n", S.ch);
system("pause");
break;
case 6:
system("cls");
printf("请输入要插入的字符串:");
StrAssign(&S1);
printf("请输入插入的位置:");
scanf("%d", &pos);
StrConcat(&S, S1, S2);
StrDelete(&S, pos + 1, S1.length);
printf("插入后的字符串为:%s\n", S.ch);
system("pause");
break;
case 7:
system("cls");
printf("请输入要替换的字符串:");
StrAssign(&S1);
printf("请输入要替换成的字符串:");
StrAssign(&S2);
Replace(&S, S1, S2);
printf("替换后的字符串为:%s\n", S.ch);
system("pause");
break;
case 8:
system("cls");
printf("请输入要查找的字符串:");
StrAssign(&S1);
printf("请输入要查找的子串:");
StrAssign(&S2);
StrLocate(S1, S2);
system("pause");
break;
}
}
return 0;
}
//串赋值 Status StrAssign(HString *S) { char str[100]; scanf("%s", str); S->length = strlen(str); S->ch = (char *) malloc((S->length + 1) * sizeof(char)); strcpy(S->ch, str); return OK; } //求串长 Status StrLength(HString S) { return S.length; } //串比较 Status StrCompare(HString S1, HString S2) { int i; for (i = 0; i < S1.length && i < S2.length; i++) { if (S1.ch[i] != S2.ch[i]) { return S1.ch[i] - S2.ch[i]; } } return S1.length - S2.length; } //串连接 Status StrConcat(HString *S, HString S1, HString S2) { S->length = S1.length + S2.length; S->ch = (char *) malloc((S->length + 1) * sizeof(char)); int i; for (i = 0; i < S1.length; i++) { S->ch[i] = S1.ch[i]; } for (i = 0; i < S2.length; i++) { S->ch[S1.length + i] = S2.ch[i]; } S->ch[S->length] = '\0'; return OK; } //求子串 HString SubStr(HString *S, HString S1, int pos, int len) { if (pos < 1 || pos > S1.length || len < 0 || len > S1.length - pos + 1) { printf("子串位置或长度不合法\n"); return S1; } S->ch = (char *) malloc((len + 1) * sizeof(char)); int i; for (i = 0; i < len; i++) { S->ch[i] = S1.ch[pos + i - 1]; } S->ch[len] = '\0'; S->length = len; } //子串插入 Status StrDelete(HString *S, int pos, int len) { if (pos < 1 || pos > S->length || len < 0 || len > S->length - pos + 1) { printf("删除位置或长度不合法\n"); return ERROR; } int i; for (i = pos + len - 1; i < S->length; i++) { S->ch[i - len] = S->ch[i]; } S->length -= len; S->ch[S->length] = '\0'; } //子串置换 Status Replace(HString *S, HString S1, HString S2) { int pos = 0; while (pos < S->length) { pos = StrCompare(SubStr(&S1, *S, pos + 1, S1.length), S1); if (pos != -1) { StrDelete(S, pos + 1, S1.length); StrConcat(S, SubStr(&S2, S2, 1, S2.length), *S); StrConcat(S, *S, SubStr(&S2, S2, S2.length - S1.length + pos + 2, S2.length - S1.length - pos - 1)); } } return OK; } //子串定位 Status StrLocate(HString S, HString T) { int i, j, k; for (i = 0; i <= S.length - T.length; i++) { for (j = i, k = 0; k < T.length && S.ch[j] == T.ch[k]; j++, k++); if (k == T.length) { printf("子串在主串中的位置为:%d\n", i + 1); return OK; } } printf("未找到子串\n"); }
原文地址: https://www.cveoy.top/t/topic/mXEO 著作权归作者所有。请勿转载和采集!