Después de dividir la dirección IP, quiero seleccionar el último elemento, es decir, 15 e incrementarlo, pero después de obtener 192 en buff cuando pasa al primer caso, ¡obtengo una falla de segmentación!
¿Por qué no puede ir más allá? ¿Cuál puede ser el problema?
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; }En su código, en la primera iteración ( o, en ese caso, en cualquier otra iteración, excepto cuando se alcanza el case 3 )
lastelem=atoi(str5); str5 no está inicializado, por lo que está invocando un comportamiento indefinido .
Debe usar str5 solo después de que se haya asignado. Puede usar una bandera, si lo desea, para marcar el acierto en el case 3: o coloque el código debajo del bloque del case .
Además, no necesita asignar memoria a buff , ya que la sobrescribe con el puntero devuelto por strtok() . Eso crea una pérdida de memoria .
Mueva sus cosas relacionadas con str5 , dentro de case3
case 3: str5 = buff; lastelem = atoi(str5); sprintf(str5, "%d", lastelem); break;Además, no es necesario asignar memoria para mejorar, no está copiando algo en él, solo está señalando algo, esto causará una pérdida de memoria en su código.