c中的子串不使用函数

时间:2014-11-24 05:14:17

标签: c string substring

我已经看到很多使用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;
}

1 个答案:

答案 0 :(得分:2)

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

如果某个角色未通过测试,请在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;
}