C 分割包含IP地址的数组时出现分段错误

C 分割包含IP地址的数组时出现分段错误,c,string,pointers,split,segmentation-fault,C,String,Pointers,Split,Segmentation Fault,在分割IP地址后,我想挑出最后一个元素,即15并增加它,但在buff中获得192后,当它转到第1种情况时,我得到了分割错误 为什么不能更进一步?有什么问题吗 int main(int argc, char** argv) { char str[] = "192.168.10.15"; char str1[12]; char *str2, *str3, *str4, *str5; unsigned char bytes[4]; int i = 0; int lastelem; char

在分割IP地址后,我想挑出最后一个元素,即15并增加它,但在
buff
中获得192后,当它转到第1种情况时,我得到了分割错误

为什么不能更进一步?有什么问题吗

int main(int argc, char** argv) 
{

char str[] = "192.168.10.15"; 
char str1[12];
char *str2, *str3, *str4, *str5;
unsigned char bytes[4];
int i = 0;

int lastelem; 

char* buff = (char *)malloc(20);
buff = strtok(str,".");


while (buff != NULL)
{
   printf("%s\n",buff);

   switch(i)
   {
       case 0: str2=buff;
       break;

       case 1: str3=buff;
       break;

       case 2: str4=buff;
       break;

       case 3: str5=buff;
       break;
   } 

   lastelem=atoi(str5);
   sprintf(str5, "%d",lastelem);

   bytes[i] = (unsigned char)atoi(buff);
   buff = strtok(NULL,".");
   i++;
}
return 0;
}

在您的代码中,在第一次迭代中,(或者,在这种情况下,在任何其他迭代中,除非命中了
案例3

str5
未初始化,因此正在调用

只有在分配了str5之后,才能使用它。如果需要,您可以使用一个标志来标记对
案例3:
的命中,或者将代码放在
案例
块本身下


此外,您不需要将内存分配给
buff
,因为您正在使用
strtok()
返回的指针覆盖它。这将创建一个。

将您的
str5
相关内容移动到
case3

case 3: str5 = buff;
lastelem = atoi(str5);
sprintf(str5, "%d", lastelem);
break;

另外,不需要为buff分配内存,您不是在复制其中的内容,您只是在指向某个内容,这将导致代码中的内存泄漏。

丢弃
????哇..请输入
malloc()
C
@SouravGhosh中的家庭的返回值:
malloc()
有一天,你关于不铸造
malloc()的信息会被传递出去!这个
char*buff=(char*)malloc(20);buff=strtok(str,“.”)泄漏
20个字节的内存。此外,您不能为每个分配复制数组。
sscanf(str、%d.%d.%d、&n1、&n2、&n3、&n4)
@DeepJyotiGharphalia最简单的方法,移动案例3下所有的
str5
相关代码…只需更改此行
char*buff=(char*)malloc(20)
到char*buff=NULL;
case 3: str5 = buff;
lastelem = atoi(str5);
sprintf(str5, "%d", lastelem);
break;