【问题标题】:Substring in c without using functionsc中的子字符串不使用函数
【发布时间】:2015-01-21 18:39:09
【问题描述】:

我见过许多使用 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;
}

【问题讨论】:

  • 该死的几乎所有事情都可以在 C 中通过适当构造的 for 循环来完成。
  • YES! 有很多方法可以在不使用任何这些函数的情况下在字符串中查找子字符串
  • OKAY! 只是我尝试过,但不使用这些功能就无法使其完美运行。
  • @Haxify,你能告诉我们一些代码吗,你试过什么?
  • @Himanshu 我已经添加了代码。

标签: c string substring


【解决方案1】:

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

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

输出:

$ ./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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2012-05-18
    • 2016-05-15
    • 2011-07-14
    • 2020-12-22
    • 2015-04-02
    • 2014-05-26
    相关资源
    最近更新 更多