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-stroffset=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-stroffset=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非常简单:)