我不仅想知道子字符串是否存在于缓冲区中,而是为了获得它结束的位置。我正在做一个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);
}
答案 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')的地址。但是,您只能找到一个字符,而不是字符串。