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