使用c语言编写顺序串的所有功能包括串赋值、串比较、串连接、求串长、求子串、串删除、串置换、子串查找定位等。采用菜单调用的方式实现。 菜单: 1:串赋值 2:求串长 3:串比较 4:串连接 5:求子串 6:子串插入 7:
代码如下:
#include <stdio.h> #include <string.h>
#define MAXLEN 100
typedef struct { char str[MAXLEN + 1]; int len; } SString;
void StrAssign(SString *s, char *chars); void StrCopy(SString *s, SString t); int StrLength(SString s); int StrCompare(SString s, SString t); void StrConcat(SString *s, SString t); void SubString(SString *sub, SString s, int pos, int len); void StrDelete(SString *s, int pos, int len); void StrReplace(SString *s, SString t, int pos); int Index(SString s, SString t);
int main() { SString s, t, sub; char chars[MAXLEN + 1]; int choice, pos, len, index;
while (1) {
printf("\n1:串赋值\n2:求串长\n3:串比较\n4:串连接\n5:求子串\n6:子串插入\n7:子串置换\n8:子串定位\n9:退出\n");
printf("请输入菜单选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要赋值的字符串:");
scanf("%s", chars);
StrAssign(&s, chars);
printf("赋值成功!\n");
break;
case 2:
printf("串的长度为:%d\n", StrLength(s));
break;
case 3:
printf("请输入要比较的字符串:");
scanf("%s", chars);
StrAssign(&t, chars);
if (StrCompare(s, t) < 0) {
printf("字符串 s 小于字符串 t\n");
} else if (StrCompare(s, t) > 0) {
printf("字符串 s 大于字符串 t\n");
} else {
printf("字符串 s 等于字符串 t\n");
}
break;
case 4:
printf("请输入要连接的字符串:");
scanf("%s", chars);
StrAssign(&t, chars);
StrConcat(&s, t);
printf("连接成功,结果为:%s\n", s.str);
break;
case 5:
printf("请输入子串的起始位置和长度:");
scanf("%d %d", &pos, &len);
SubString(&sub, s, pos, len);
printf("子串为:%s\n", sub.str);
break;
case 6:
printf("请输入要插入的子串及其起始位置:");
scanf("%s %d", chars, &pos);
StrAssign(&t, chars);
StrInsert(&s, t, pos);
printf("插入成功,结果为:%s\n", s.str);
break;
case 7:
printf("请输入要替换的子串及其起始位置:");
scanf("%s %d", chars, &pos);
StrAssign(&t, chars);
StrReplace(&s, t, pos);
printf("替换成功,结果为:%s\n", s.str);
break;
case 8:
printf("请输入要查找的子串:");
scanf("%s", chars);
StrAssign(&t, chars);
index = Index(s, t);
if (index == -1) {
printf("未找到子串!\n");
} else {
printf("子串在字符串 s 中的位置为:%d\n", index);
}
break;
case 9:
return 0;
default:
printf("无效的选项!\n");
break;
}
}
return 0;
}
void StrAssign(SString *s, char *chars) { int len = strlen(chars); if (len > MAXLEN) { len = MAXLEN; } strncpy(s->str, chars, len); s->len = len; }
void StrCopy(SString *s, SString t) { strncpy(s->str, t.str, t.len); s->len = t.len; }
int StrLength(SString s) { return s.len; }
int StrCompare(SString s, SString t) { int i; for (i = 0; i < s.len && i < t.len; i++) { if (s.str[i] != t.str[i]) { return s.str[i] - t.str[i]; } } return s.len - t.len; }
void StrConcat(SString *s, SString t) { int len = s->len + t.len; if (len > MAXLEN) { len = MAXLEN; } strncat(s->str, t.str, len - s->len); s->len = len; }
void SubString(SString *sub, SString s, int pos, int len) { if (pos < 1 || pos > s.len || len < 0 || pos + len - 1 > s.len) { sub->len = 0; } else { strncpy(sub->str, s.str + pos - 1, len); sub->len = len; } }
void StrDelete(SString *s, int pos, int len) { if (pos < 1 || pos > s->len || len < 0 || pos + len - 1 > s->len) { return; } strncpy(s->str + pos - 1, s->str + pos + len - 1, s->len - pos - len + 1); s->len -= len; }
void StrReplace(SString *s, SString t, int pos) { if (pos < 1 || pos > s->len || t.len == 0 || pos + t.len - 1 > s->len) { return; } strncpy(s->str + pos - 1, t.str, t.len); StrDelete(s, pos + t.len, s->len - pos - t.len + 1); StrInsert(s, t, pos + t.len); }
int Index(SString s, SString t) { int i = 1, j = 1, k; while (i <= s.len - t.len + 1 && j <= t.len) { if (s.str[i - 1] == t.str[j - 1]) { i++; j++; } else { i = i - j + 2; j = 1; } } if (j > t.len) { return i - t.len; } else { return -1; } }
原文地址: https://www.cveoy.top/t/topic/bstb 著作权归作者所有。请勿转载和采集!