你给出的代码部分有一些错误和疏漏,尤其是在字符串处理和指针操作方面。现针对这些问题,下面是修改后的版本,并添加了一些注释以解释每个修改点。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char* str;
int length;
} String;
String* init_string(void) {
String* L = (String*)malloc(sizeof(String));
L->str = NULL;
L->length = 0;
return L;
}
int SubString(String* L, String S, int pos, int len) {
if (S.length < pos + len - 1 || pos <= 0 || len < 0) {
return 0; // 参数不合理,返回失败
} else {
L->str = (char*)malloc(sizeof(char) * (len + 1)); // 分配内存
strncpy(L->str, S.str + pos - 1, len); // 注意pos - 1,因为字符串下标从0开始
L->str[len] = '\0'; // 字符串应该有结束符
L->length = len;
}
return 1;
}
int Index(String S, String L) {
int i = 0, j = 0;
while (i < S.length && j < L.length) {
if (S.str[i] == L.str[j]) {
i++;
j++;
} else {
i = i - j + 1; // 回溯
j = 0;
}
}
if (j == L.length) {
return i - j + 1; // 返回匹配值的起始位置
} else {
return -1; // 未找到
}
}
int main(void) {
String* S = init_string();
String* L = init_string();
char ch[50];
printf("输入主串S: ");
gets_s(ch, sizeof(ch)); // 使用gets_s防止输入过长
S->str = (char*)malloc(sizeof(char) * (strlen(ch) + 1));
strcpy(S->str, ch);
S->length = strlen(ch);
SubString(L, *S, 1, 5); // pos和len输入需要合理
printf("子串L: %s\n", L->str);
printf("主串S: %s\n", S->str);
int position = Index(*S, *L);
if (position != -1) {
printf("子串L在主串S中的位置: %d\n", position);
} else {
printf("未找到子串L\n");
}
free(S->str);
free(S);
free(L->str);
free(L);
return 0;
}
关键修改点有:
1. `SubString`函数中增加了对内存的分配,并确保正确拷贝和终止符结尾。
2. `Index`函数中的字符串匹配逻辑修正,并最终返回匹配的初始位置。
3. 提高了安全性,比如使用`gets_s`函数防止缓冲区溢出。
4. 在主程序中适当地设置字符串,并打印相应结果,防止内存泄漏,最后注意释放所有分配的内存。
以上修改确保了代码能够正常运行,并且`Index`函数返回正确的匹配位置。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |