我已经看到很多使用strndup或memcpy或strncpy等获取字符串子串的解决方案。
我想知道是否有办法在不使用这些函数的情况下获取子字符串;即使这是不必要的。
编辑:我自己尝试制作功能;我不记得问题是什么,但出了问题,我最终没有使用它。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;
}
答案 0 :(得分:2)
有多种方法可以重新创建strstr
。以下是使用inch-worm
方法的快速实现,您只需使用指针在substring
中搜索string
的开头,然后如果找到,则比较{{1}中的每个字符使用substring
中的相应字符。如果所有字符都匹配,则找到子字符串,返回指向string
中substring
开头的指针。
如果某个角色未通过测试,请在string
中查找与string
中的第一个角色匹配的其他角色,直到substring
用尽。
可能还有几个可以启用的检查,但是这个例子应该让你开始:
string
<强>输出:强>
#include <stdio.h>
#include <stdlib.h>
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;
}