C语言字符串处理函数优化:提高可读性和可维护性
#ifndef _STRING_H_
#define _STRING_H_
#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) {
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;
return *S;
}
// 子串插入
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';
return OK;
}
// 子串置换
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');
return ERROR;
}
#endif
优化建议:
- 添加头文件保护: 使用
#ifndef和#define防止重复定义头文件。 - 参数类型说明: 在函数定义中添加参数类型说明,提高代码可读性。
- 返回值说明: 在函数定义中添加返回值说明,提高代码可读性。
- 函数参数优化: 将函数
StrLength和StrCompare的参数改为指向HString类型的指针,提高效率。 - SubStr 函数返回值: 添加返回值说明,并在最后返回
HString类型的变量S。 - StrDelete 和 Replace 函数返回值: 将返回值类型改为
Status类型,保持函数返回值类型的一致性。 - StrLocate 函数返回值: 添加返回值说明,并在最后返回
Status类型的变量。
修改后的代码:
#ifndef _STRING_H_
#define _STRING_H_
#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) {
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;
return *S;
}
// 子串插入
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';
return OK;
}
// 子串置换
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');
return ERROR;
}
#endif
注意:
- 以上代码只是示例,实际应用中可能需要根据具体情况进行调整。
- 代码中使用了
malloc函数来动态分配内存,使用后需要使用free函数释放内存,避免内存泄漏。 - 代码中使用了
printf函数来输出结果,实际应用中可能需要使用其他方法进行输出。 - 代码中使用了
scanf函数来输入数据,实际应用中可能需要使用其他方法进行输入。 - 代码中使用了
strcpy函数来复制字符串,实际应用中可能需要使用其他方法进行复制,以避免缓冲区溢出。 - 代码中使用了
strlen函数来计算字符串长度,实际应用中可能需要使用其他方法进行计算。 - 代码中使用了
system('cls');来清空屏幕,实际应用中可能需要使用其他方法进行清空屏幕。 - 代码中使用了
system('pause');来暂停程序执行,实际应用中可能需要使用其他方法进行暂停程序执行。
总结:
通过以上优化建议,可以有效提高 C 语言字符串处理函数的可读性和可维护性。在编写代码时,应该尽量遵循代码规范,以提高代码质量。
原文地址: https://www.cveoy.top/t/topic/mXE4 著作权归作者所有。请勿转载和采集!