|
发表于 2024-9-18 21:03:03
|
显示全部楼层
您在 `Index` 函数实现时遇到了一些问题。我会帮您进行修正和简化实现。此外,修正 `SubString` 函数中的一些逻辑错误。
### 更新后的代码
- #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;
- }
- free(L->str); // 防止内存泄漏
- L->str = (char*)malloc(len + 1);
- strncpy(L->str, S.str + pos, len);
- L->str[len] = '\0';
- L->length = len;
- return 1;
- }
- int Index(String S, String L) {
- int i, j;
- for (i = 0; i <= S.length - L.length; i++) {
- for (j = 0; j < L.length; j++) {
- if (S.str[i + j] != L.str[j]) {
- break;
- }
- }
- if (j == L.length) {
- return i;
- }
- }
- return -1;
- }
- int main(void) {
- String* S = init_string();
- String* L = init_string();
- char* ch = "hello world";
- S->str = (char*)malloc(sizeof(char) * (strlen(ch) + 1));
- strcpy(S->str, ch);
- S->length = strlen(ch);
- // 测试SubString函数,获取子串
- SubString(L, *S, 1, 5);
- printf("L subString: %s\n", L->str);
- // 测试Index函数,进行朴素匹配
- int index = Index(*S, *L);
- if (index != -1) {
- printf("Substring found at index %d\n", index);
- } else {
- printf("Substring not found\n");
- }
- // 内存释放
- free(S->str);
- free(L->str);
- free(S);
- free(L);
- return 0;
- }
复制代码
### 代码关键点
1. **内存分配和释放**:
- 对 `S` 进行内存分配后需释放之前的内容以防内存泄漏。
2. **SubString函数**:
- 检查边界条件,防止访问越界。
- 使用 `strncpy` 复制字符串,最后添加字符串结束符 `\0`。
3. **Index函数**:
- 实现了朴素匹配的基本逻辑,通过两层循环检查子串是否匹配。
希望这些更新会让您的代码运行得更顺畅!如果有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|