c中的子串位置

时间:2018-03-08 04:46:48

标签: c substring

我不仅想知道子字符串是否存在于缓冲区中,而是为了获得它结束的位置。我正在做一个ftp,它会寻找@filestart;开始复制文件,只有在找到@fileend时才返回文件; 我会发送第一条消息:@filestart; len = 50; 第一部分很简单,因为我可以使用strstr找到@filestart。但在那之后我想知道len的结束,所以我可以"运行"进入缓冲区,从该位置向前直到找到等号并开始复制长度,直到char&#34 ;;"或者' \ 0"被发现。对不起,我的英语废话,我来自巴西,不知道英语好,但我希望大家都明白。我做了一个功能,但我想知道是否有一个标准的。这是我的:

#define unsigned int B32U
#define char B8

B32U strsub(B8 *data, B8 *key) {
    if (data && key) {
        B8 *d = data;
        B32U len = strlen(key), p = 0;
        if (len > strlen(d))
            return (0);
        while (*d != '\0') {
            if (*(d + len) != '\0') {
                B32U x = 0;
                while (x < len) {
                    if (key[x] == *d) {
                        *d++;
                        p++;
                    } else
                        break;
                    x++;
                }
                if (x == len)
                    return (p);
            } else {
                if (len == 1)
                    if (*d == key[0])
                        return (p);
                B32 x = 0;
                while (x < len) {
                    if (key[x] == *d) {
                        *d++;
                        p++;
                    } else 
                        return (0);
                    x++;
                }
                return (p);
            }
            p++;
            *d++;
        }
    }
    return (0);
}

2 个答案:

答案 0 :(得分:0)

这些定义确实存在问题且代码无法编译:

#define unsigned int B32U
#define char B8

根据上面的定义,您没有将B32U定义为预处理器宏,而是unsigned,它将扩展为int B32U,而不是您想要的。

您应该使用typedef来定义这些类型:

typedef unsigned int B32U;
typedef char B8;

或者根本不定义这些类型并使用标准类型。

您可以使用strstr编写一个简单的函数,该函数返回指向匹配结尾的指针,或者NULL找不到匹配项:

#include <string.h>

char *strstr_end(const char *s1, const char *s2) {
    char *p = strstr(s1, s2);
    if (p)
        p += strlen(s2);
    return p;
}

如果您坚持从字符串的开头返回偏移量,则可以返回值为-1的带符号类型(如果没有匹配),如果匹配则返回结束的偏移量。 ptrdiff_t是一个很好的类型:

#include <stddef.h>
#include <string.h>

ptrdiff_t strstr_endpos(const char *s1, const char *s2) {
    char *p = strstr(s1, s2);
    if (p)
        return p - s1 + strlen(s2);
    else
        return -1;
}

答案 1 :(得分:-1)

要解决您的问题,您可以使用:     char * strrchr(const char * str,int c)

此函数(在string.h中)将返回字符串str中最后一次出现的字符c(在您的情况下为';'或'\ 0')的地址。但是,您只能找到一个字符,而不是字符串。