c中的子串不使用函数

我已经看到了许多使用strndup或memcpy或strncpy等获取字符串子串的解决方案。

我想知道是否有办法在不使用这些函数的情况下获取子串; 即使这是不必要的。

编辑:我自己尝试制作function; 我不记得问题是什么,但出了问题,我最终没有使用它。

char *substring(char *str, int start, int length) { char *s = malloc(sizeof(char)*(length+1)); for(int i=start; i<start+length; i++) { s[i-start] = str[i]; } s[length] = '\0'; return s; } 

有许多方法可以重新创建strstr 。 以下是使用inch-worm方法的快速实现,您只需使用指针在substring中搜索substring string的开头,然后如果找到,则将substring中的每个字符与substring中的相应字符进行比较。 如果所有字符都匹配,则找到子字符串,返回指向substring string开头的指针。

如果某个字符未通过测试,请在string中查找与substring string中的第一个字符匹配的另一个字符,直到string耗尽为止。

可能还有几个可以补充的检查,但是这个例子可以让你开始:

 #include  #include  char *strstr2 (char *str, char *sub) { if (!str || !sub) return NULL; /* validate both strings */ char *p = NULL; /* general pointer */ char *sp = NULL; /* substring pointer */ char *rp = NULL; /* return pointer */ char matched = 0; /* matched flag */ size_t szstr = 0; /* string length */ size_t szsub = 0; /* substring length */ p = sub; while (*p++) szsub++; /* strlen of substr */ p = str; while (*p++) szstr++; /* strlen of str */ if (szsub > szstr) return NULL; /* szstr < szsub - no match */ p = str; while (p < (p + szstr - szsub + 1)) { while (*p && *p != *sub) p++; /* find start of sub in str */ if ((str + szstr) == p) return NULL; /* if end reached - no sub */ rp = p; /* save return pointer */ sp = sub; /* set sp to sub */ matched = 1; /* presume will match */ while (*sp) /* for each in substring */ if (*p++ != *sp++) { /* check if match fails */ matched = 0; /* if failed, no match */ break; /* break & find new start */ } if (matched) /* if matched, return ptr */ return rp; /* to start of sub in str */ } return NULL; /* no match, return NULL */ } int main() { char *string = NULL; char *substr = NULL; char *begin = NULL; printf ("\nEnter string : "); scanf ("%m[^\n]%*c", &string); printf ("\nEnter substr : "); scanf ("%m[^\n]%*c", &substr); if ((begin = strstr2 (string, substr)) != NULL) printf ("\nSubstring found beginning at : %s\n\n", begin); else printf ("\nSubstring NOT in string.\n\n"); if (string) free (string); if (substr) free (substr); return 0; } 

输出:

 $ ./bin/strstr Enter string : This is the full string or "haystack". Enter substr : g or " Substring found beginning at : g or "haystack". $ ./bin/strstr Enter string : This is the full string or "haystack". Enter substr : g or ' Substring NOT in string.