Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c中的子串位置_C_Substring - Fatal编程技术网

c中的子串位置

c中的子串位置,c,substring,C,Substring,我不仅想知道子字符串是否存在于缓冲区中,还想知道它结束的位置。我正在进行ftp,它将查找@filestart;开始复制文件,仅在找到@fileend时返回文件; 我将发送第一条类似这样的消息:@filestart;len=50; 第一部分很简单,因为我可以使用strstr查找@filestart。但在此之后,我想知道len的结尾,这样我就可以“运行”到缓冲区中,从该位置向前,直到找到等号,然后开始复制长度,直到字符“;”或“\0”“找到了。对不起,我的蹩脚英语,我来自巴西,不知道很好的英语,但我

我不仅想知道子字符串是否存在于缓冲区中,还想知道它结束的位置。我正在进行ftp,它将查找@filestart;开始复制文件,仅在找到@fileend时返回文件; 我将发送第一条类似这样的消息:@filestart;len=50; 第一部分很简单,因为我可以使用strstr查找@filestart。但在此之后,我想知道len的结尾,这样我就可以“运行”到缓冲区中,从该位置向前,直到找到等号,然后开始复制长度,直到字符“;”或“\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);
}
#定义无符号整数B32U
#定义字符B8
B32U strsub(B8*数据,B8*键){
if(数据和键){
B8*d=数据;
B32U len=strlen(键),p=0;
如果(len>strlen(d))
返回(0);
而(*d!='\0'){
如果(*(d+len)!='\0'){
B32ux=0;
while(x
要解决您的问题,您可以使用: 字符*strrchr(常量字符*str,int c)


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

这些定义确实有问题,代码无法编译:

#define unsigned int B32U
#define char B8
使用上面的定义,您不会将
B32U
定义为预处理器宏,而是将
无符号
,它将扩展到
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;
}

为什么不
char*keyloc;如果((keyloc=strstrstr(data,key)){/*key exists*/keyloc+=strlen(key);/*要在data*/}中查找key的一个过去的结尾
?“我不仅想知道子字符串是否存在于缓冲区中,还想得到它结束的位置。”
char*start=strtr(buf,target);字符*结束=开始!=无效的start+strlen(目标):空
@DavidC.Rankin请注意,OP的代码处理
NULL
输入,这与
strstr()
不同。确切地说——正确的防护装置已经存在
:)
也。。。我不仅想知道子字符串是否存在于缓冲区中,而且想知道它结束的位置,如果你有子字符串,并且你知道它在你正在搜索的字符串中的起始位置,你已经知道它结束的位置了,因为你知道子字符串有多长。但是我如何从上次出现时知道“int”位置呢?它将返回一个字符,而不是一个int?我的目的是获取int而不是charIn fatc,它将返回一个char*,这是一个指针。但你们可以对指针进行算术运算。sizeof(char)=1,所以只需得到结果并输出初始指针,您就有了一个intI,我会尝试一下,稍后我会告诉您结果。谢谢sugestionI,我不认为这个功能会很方便。因为在上一个例子中,我读了“;”,但在此之前,我读了“len”,所以我必须逐字符运行以了解结果。我做的这两件事之间没有多大区别。如果我必须运行缓冲区,我宁愿得到最终结果,而不是通过strrchr函数将其拆分为多个进程。定义有什么问题?我的代码工作时间太长,我总是使用这样的类型。无论如何,我会对它进行测试。我发现你的座位很满。又小又聪明。非常感谢。
#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;
}