0

我正在尝试将一个字符串解析为更小的字符串,提取一些值,然后我想检查这些值中是否有任何一个是骗子......

这是我的蹩脚代码:)

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="INVITE sip:alice1@open-ims.test SIP/2.0\nCall-ID: mndfdnf8e4953t984egnue@open-ims.test To: <sip:alice2@open-ims.test>;<sip:alice@open-ims.test>;<sip:alice4@open-ims.test>;<sip:alice5@open-ims.test>;<sip:alice6@open-ims.test>;<sip:alice@open-ims.test>;<sip:alice8@open-ims.test>;<sip:alice9@open-ims.test>;<sip:alice10@open-ims.test>;<sip:alice11@open-ims.test>;<sip:alice12@open-ims.test>;";
  char * tch;
  char * saved;  
char * array[50];
int count = 0;        
  tch = strtok (str,"<:;>");
    while (tch != NULL)
  { 
    int savenext = 0;              
    if (!strcmp(tch, "sip"))   
    {                             
      savenext = 1;                
    }                               
    printf ("%s\n",tch);
    tch = strtok (NULL, "<:;>");
    if (savenext == 1)             
    {                              
      saved = tch;                  
    }                              

if ( count == 0 ) {
    array[count] = saved;  
    count ++;  
    }
    if ( count > 0 ) {
        int i = 0;
        while (i < count ) {
            if (array[count] == saved ) {
                printf("FOUND!");
                }
                i++;}
                }


            }
 }

我要做的是检查是否在字符串中找到了两次相同的用户名,但是我缺乏指针经验使我无法做到这一点。我无法弄清楚为什么这些值不会添加到数组中。

欢迎和赞赏任何帮助

4

1 回答 1

3

你已经完成了

if ( count == 0 ) {
array[count] = saved;  
count ++;  
}

这意味着您保存savedinto的地址array[count]。在此操作中,没有复制任何字符串。

然后你做:

if (array[count] == saved ) {
  printf("FOUND!");
}

上面将存储的值array[count]与存储的地址进行比较saved。此操作不比较存储在其中的字符串。

因此,如果地址0x1234abcdinarray[count] 指向字符串“alice”并saved指向存储在另一个内存位置的字符串“alice”,0xdeadbeef那么array[count] == string与在这种情况下0x1234abcd == 0xdeadbeef所做的情况不同。要比较您需要做的两个字符串strcmp (array[count], saved) == 0

请注意,您这样做

    while (i < count ) {
        if (array[count] == saved ) {
            printf("FOUND!");
            }
      i++;
     }

在上面的代码中,您已经递增i但访问了一次arraycount它是静态的,并且不依赖于i. 它应该是array[i]

你已经完成了

if (count == 0)
{
   array[count] = saved;  
   count ++
}
if (count > 0)
{
  /* Here you try to search if the 'saved' is in the aray
     but if it is not there you have NOT inserted it anywhere 
     into the array
   */
}

因为您没有输入savedwhen指向的字符串,count > 0所以除了第一个字符串之外的唯一字符串不会存储在array. 因此,当您发现新的字符串不在if (count > 0)块中的字符串中时,您应该将其保存到数组中。如以下部分所述:

  if (count > 0)
    {
      int i = 0;
      while (i < count)
        {
          /* note use of strcmp */
          if (strcmp (array[i], saved) == 0)
            {
              printf ("FOUND!"); /* if it was found break immediately */
              break;
            }
          i++;
        }
       if (i == count) /* if there was no match then only i == count  */
        {              /* in other cases when dupes are there i<count as we used break */
          array[count] = saved;
          count++;
        }

    }

这是修改后的代码,它反映了上述更改。

#include <stdio.h>
#include <string.h>
int main (void)
{
  char str[] =
    "INVITE sip:alice1@open-ims.test SIP/2.0\nCall-ID: mndfdnf8e4953t984egnue@open-ims.test To: <sip:alice2@open-ims.test>;<sip:alice@open-ims.test>;<sip:alice4@open-ims.test>;<sip:alice5@open-ims.test>;<sip:alice6@open-ims.test>;<sip:alice@open-ims.test>;<sip:alice8@open-ims.test>;<sip:alice9@open-ims.test>;<sip:alice10@open-ims.test>;<sip:alice11@open-ims.test>;<sip:alice12@open-ims.test>;";
  char *tch;
  char *saved;
  char *array[50];
  int count = 0, i;

  tch = strtok (str, "<:;>");
  while (tch != NULL)
  {
      int savenext = 0;
      if (!strcmp (tch, "sip"))
  {
      savenext = 1;
      }
     // printf ("%s\n", tch);
     tch = strtok (NULL, "<:;>");
     if (savenext == 1)
 {
   saved = tch;
 }

    if (count == 0)
    {
  array[count] = saved;
  count++;
    }
    else if ((count > 0) && (savenext == 1))
    {
      int i = 0;
      while (i < count)
      {
        if (strcmp (array[i], saved) == 0)
    {
      printf ("FOUND!");
      break;
    }
        i++;
      }
      if (i == count)
      {
        array[count] = saved;
        count++;
      } 

    }
     }

    for (i = 0; i < count; i++)
       printf ("\n%s", array[i]);
}

编辑1:

回答您的评论:假设strtok已匹配“sip”,然后它会saveptr = 1读取下一个并标记在 中tch,即用户名信息并array在 的帮助下将其保存到saveptr。在下一次迭代中,注意tch指向存储在数组中的用户名信息。因此strcmp失败,因为它不是“sip”(包含用户名信息)。因此,在这种情况下,saved虽然没有修改,但它仍然保留先前的值,该值if (count > 0)再次进入块。因此,在您的过程中会检查两次用户信息。你应该做

if ((count > 0) && (savenext == 1))
{
     /* Then insert */
}

上面的代码说的是,如果saveptr ==需要saved将其保存在 中array,这就是您使用 flag 的原因savenext

我也更新了代码。现在它正确地表明只有一个重复项。

我建议重新设计代码并使其更干净。可能您想再看一下详细的指针以使其更好。

于 2011-06-06T17:42:29.573 回答