|
发表于 2024-9-18 21:15:38
|
显示全部楼层
你给出的代码部分有一些错误和疏漏,尤其是在字符串处理和指针操作方面。现针对这些问题,下面是修改后的版本,并添加了一些注释以解释每个修改点。
- #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 小助理,如未能正确解答您的问题,请继续追问。 |
|