C 搜索字符串的更好优化方法
我有一个字符串,格式如下:C 搜索字符串的更好优化方法,c,substring,C,Substring,我有一个字符串,格式如下: <abcde@123.343:5060;gr=xyz123>;+g134,<more_text> 它工作正常,但我想知道是否有任何方法可以避免while循环和倒退?您可以搜索第一次出现的“”并查看“gr=”是否介于两者之间 lt = strchr(ptr,'<'); gt = strchr(ptr,'>'); gr = strstr(ptr,"gr="); if ( gr > lt && gr < gt
<abcde@123.343:5060;gr=xyz123>;+g134,<more_text>
它工作正常,但我想知道是否有任何方法可以避免while循环和倒退?您可以搜索第一次出现的“”并查看“gr=”是否介于两者之间
lt = strchr(ptr,'<');
gt = strchr(ptr,'>');
gr = strstr(ptr,"gr=");
if ( gr > lt && gr < gt) {
strncat(newstring,lt,gt-lt);
}
lt=strchr(ptr');
gr=strstr(ptr,“gr=”);
如果(gr>lt&&gr
您可以搜索第一次出现的“”并查看“gr=”是否介于两者之间
lt = strchr(ptr,'<');
gt = strchr(ptr,'>');
gr = strstr(ptr,"gr=");
if ( gr > lt && gr < gt) {
strncat(newstring,lt,gt-lt);
}
lt=strchr(ptr');
gr=strstr(ptr,“gr=”);
如果(gr>lt&&gr
您可以使用strcspn获取到下一个标记的偏移量。您的代码没有查找下一个实例的循环,但这段代码有。我假设你的循环超出了这个范围,也许你需要适应一下
size_t offset = 0, length;
offset = strcspn(str, "<");
while (str[offset] != '\0')
{
++offset;
length = strcspn(str + offset, ">");
ptr = strstr(str + offset, "gr=");
if (ptr != NULL && ptr - str < offset + length)
{
strncpy(newstring, ptr + offset, length);
/* do what you need with newstring here */
}
offset = strcspn(str + offset + length + 1, "<");
}
size\u t offset=0,长度;
偏移量=strcspn(str,“”);
ptr=strstrstr(str+offset,“gr=”);
if(ptr!=NULL&&ptr-str offset=strcspn(str+offset+length+1,“您可以使用strcspn获取下一个标记的偏移量。您的代码没有用于查找下一个实例的循环,但此代码有。我假设您的循环在该范围之外,可能您需要进行一些调整
size_t offset = 0, length;
offset = strcspn(str, "<");
while (str[offset] != '\0')
{
++offset;
length = strcspn(str + offset, ">");
ptr = strstr(str + offset, "gr=");
if (ptr != NULL && ptr - str < offset + length)
{
strncpy(newstring, ptr + offset, length);
/* do what you need with newstring here */
}
offset = strcspn(str + offset + length + 1, "<");
}
size\u t offset=0,长度;
偏移量=strcspn(str,“”);
ptr=strstrstr(str+offset,“gr=”);
if(ptr!=NULL&&ptr-str offset=strcspn(str+offset+length+1,“您可以通过精确解析字符串一次而不是多次来完成此操作(与此处的其他答案不同)。下面的代码可以处理您给定的任何子字符串,前提是该子字符串没有任何重复字符
其思想是复制任意
之间的任何内容;复制时查找子字符串,如果未找到,则继续,直到找到为止
char *str = "<abcde@123.343:5060;gr=xyz123>;+g134,<more_text>";
char result[MAX_LENGTH];
size_t i = 0, j = 0;
char copying = 0, found = 0;
const char *subs = "gr=";
const int subs_len = 3;
while ((char ch = *str))
{
if (ch == '<')
copying = 1;
else if (ch == '>')
{
if (found)
break;
else
{
copying = 0;
i = j = 0;
}
}
else if (copying)
{
result[i++] = ch;
if (!found)
{
if (ch == subs[j])
{
++j;
if (j == subs_len)
found = 1;
}
else
{
j = (ch == subs[0]) ? 1 : 0;
}
}
}
++str;
}
result[i] = '\0';
char*str=“;+g134;”;
字符结果[最大长度];
尺寸i=0,j=0;
字符复制=0,发现=0;
const char*subs=“gr=”;
const int subs_len=3;
while((char ch=*str))
{
如果(ch='')
{
如果(找到)
打破
其他的
{
复制=0;
i=j=0;
}
}
否则,如果(复制)
{
结果[i++]=ch;
如果(!找到)
{
if(ch==subs[j])
{
++j;
if(j==subs_len)
发现=1;
}
其他的
{
j=(ch==subs[0])?1:0;
}
}
}
++str;
}
结果[i]='\0';
您可以只解析字符串一次而不是更多次(与此处的其他答案不同)。下面的代码可以处理您给定的任何子字符串,前提是该子字符串没有任何重复字符
其思想是复制任意
之间的任何内容;复制时查找子字符串,如果未找到,则继续,直到找到为止
char *str = "<abcde@123.343:5060;gr=xyz123>;+g134,<more_text>";
char result[MAX_LENGTH];
size_t i = 0, j = 0;
char copying = 0, found = 0;
const char *subs = "gr=";
const int subs_len = 3;
while ((char ch = *str))
{
if (ch == '<')
copying = 1;
else if (ch == '>')
{
if (found)
break;
else
{
copying = 0;
i = j = 0;
}
}
else if (copying)
{
result[i++] = ch;
if (!found)
{
if (ch == subs[j])
{
++j;
if (j == subs_len)
found = 1;
}
else
{
j = (ch == subs[0]) ? 1 : 0;
}
}
}
++str;
}
result[i] = '\0';
char*str=“;+g134;”;
字符结果[最大长度];
尺寸i=0,j=0;
字符复制=0,发现=0;
const char*subs=“gr=”;
const int subs_len=3;
while((char ch=*str))
{
如果(ch='')
{
如果(找到)
打破
其他的
{
复制=0;
i=j=0;
}
}
否则,如果(复制)
{
结果[i++]=ch;
如果(!找到)
{
if(ch==subs[j])
{
++j;
if(j==subs_len)
发现=1;
}
其他的
{
j=(ch==subs[0])?1:0;
}
}
}
++str;
}
结果[i]='\0';
是的,还有其他方法,但为什么您认为它们会更好呢?您可以做的一件事是一次过构建newstring
(从temp1
到temp2
)。是的,还有其他方法,但为什么您认为它们会更好?您可以做的一件事是一次过构建newstring
(从temp1
到temp2
)。由于搜索lt>只需一个字符,您可以使用比strstr稍快的strchr。无论如何,您的解决方案似乎比我的更有效、更简单。做得好。@FabioCeconello,谢谢,即使是盲松鼠有时也会抓到坚果。@CDahn谢谢!回答得很好!:)@chux如果我写strstrstr会发生什么(ptr,@CDahn你想让它在循环中吗?否则,如果gr参数不在第一对<>中,这就行不通了!因为对lt>的搜索只有一个字符,你可以使用比strstrstr稍快的strchr。无论如何,你的解决方案似乎比我的更有效、更简单。做得好。@Fabioconello,谢谢,甚至是盲squirrel有时会犯错误。@CDahn谢谢!回答得很好!:)@chux如果我写strstr(ptr,@CDahn你想让它在一个循环中发生什么?因为否则如果gr参数不在第一对<>中,这将不起作用!谢谢!但我认为@CDahn solution非常简单:)谢谢!但我认为@CDahn solution非常简单:)