Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C在数组中添加和搜索已解析的数据_C_Arrays_Parsing_Pointers_Segment - Fatal编程技术网

C在数组中添加和搜索已解析的数据

C在数组中添加和搜索已解析的数据,c,arrays,parsing,pointers,segment,C,Arrays,Parsing,Pointers,Segment,我试图将一个字符串解析成更小的字符串,提取一些值,然后我想检查这些值中是否有重复的 这是我的蹩脚代码:) #包括 #包括 int main() { char str[]=“邀请sip:alice1@open-ims.test SIP/2.0\n呼叫ID:mndfdnf8e4953t984egnue@open-测试到:;;;;;;;;”; char*tch; 字符*已保存; 字符*数组[50]; 整数计数=0; tch=strtok(str,“”); while(tch!=NULL) { int

我试图将一个字符串解析成更小的字符串,提取一些值,然后我想检查这些值中是否有重复的

这是我的蹩脚代码:)

#包括
#包括
int main()
{
char str[]=“邀请sip:alice1@open-ims.test SIP/2.0\n呼叫ID:mndfdnf8e4953t984egnue@open-测试到:;;;;;;;;”;
char*tch;
字符*已保存;
字符*数组[50];
整数计数=0;
tch=strtok(str,“”);
while(tch!=NULL)
{ 
int savenext=0;
如果(!strcmp(tch,“sip”))
{                             
savenext=1;
}                               
printf(“%s\n”,tch);
tch=strtok(空,“”);
if(savenext==1)
{                              
保存=tch;
}                              
如果(计数=0){
数组[计数]=已保存;
计数++;
}
如果(计数>0){
int i=0;
而(我<计数){
如果(数组[计数]==已保存){
printf(“找到了!”);
}
i++;}
}
}
}
我要做的是检查同一个用户名在字符串中是否被发现两次,但我缺乏指针方面的经验,这使我无法做到这一点。我不明白为什么这些值不会添加到数组中

欢迎并感谢您提供的任何帮助

if ( count == 0 ) {
array[count] = saved;  
count ++;  
}
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
   */
}
这意味着您将保存的
的地址保存到
数组[计数]
中。在此操作中,未复制任何字符串

然后你会:

if (array[count] == saved ) {
  printf("FOUND!");
}
上面将存储在
数组[count]
中的值与存储在
保存的
中的地址进行比较。此操作不会比较存储在其中的字符串

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

请注意,您是这样做的

    while (i < count ) {
        if (array[count] == saved ) {
            printf("FOUND!");
            }
      i++;
     }
因为在
count>0
时没有输入
saved
所指向的字符串,所以除了第一个字符串以外的唯一字符串不会存储在
数组中。因此,只要在
if(count>0)
块中发现新的sting不在sting中,就应该将其保存到数组中。如以下章节所述:

  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++;
        }

    }
上面的代码说明,如果
saveptr==
,则
已保存的
需要保存在
数组中
,这就是您使用标记
savenext
的原因

我也更新了代码。现在它正确地告诉我们只有一个副本

我建议重新设计代码,让它更干净一点。可能您希望对指针进行详细的查看,以使其更好。

您已经完成了

if ( count == 0 ) {
array[count] = saved;  
count ++;  
}
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
   */
}
这意味着您将保存的
的地址保存到
数组[计数]
中。在此操作中,未复制任何字符串

然后你会:

if (array[count] == saved ) {
  printf("FOUND!");
}
上面将存储在
数组[count]
中的值与存储在
保存的
中的地址进行比较。此操作不会比较存储在其中的字符串

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

请注意,您是这样做的

    while (i < count ) {
        if (array[count] == saved ) {
            printf("FOUND!");
            }
      i++;
     }
因为在
count>0
时没有输入
saved
所指向的字符串,所以除了第一个字符串以外的唯一字符串不会存储在
数组中。因此,只要在
if(count>0)
块中发现新的sting不在sting中,就应该将其保存到数组中。如以下章节所述:

  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++;
        }

    }
上面的代码说明,如果
saveptr==
,则
已保存的
需要保存在
数组中
,这就是您使用标记
savenext
的原因

我也更新了代码。现在它正确地告诉我们只有一个副本


我建议重新设计代码,让它更干净一点。可能您希望对指针进行更详细的了解,以使其更好。

您希望如何解析指针。请再详细说明一下。我不明白。我想提取所有的“alice”值,并检查其中是否有两次使用。如果它被发现两次,那么它应该打印一条消息。比如,我们提取值alice1、alice2、alice、alice4、alice……然后程序必须看到字符串中两次发现“alice”,并打印一条警报。我希望我把自己说得更清楚一点:)你到底想如何解析。请再详细说明一下。我不明白。我想提取所有的“alice”值,并检查其中是否有两次使用。如果它被发现两次,那么它应该打印一条消息。比如,我们提取值alice1、alice2、alice、alice4、alice……然后程序必须看到字符串中两次发现“alice”,并打印一条警报。我希望我说得更清楚一点:)哇,菲克西斯,这些是很多有用的评论。我真的很感谢你的帮助。但是,当我运行程序时,我会打印“find”消息,即使找不到用户名(例如,如果我使用
char str[]=”To:;;;;;;;;;;
则找不到相同的用户名,但会打印消息。谢谢phoxis。你已经非常高兴了!哇,phoxis,这些都是非常有用的c