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