Cómo dividir una matriz de caracteres

Estoy tratando de dividir una matriz (cadena1) de n caracteres en dos punteros de caracteres que representan i caracteres (char * primero) y ni caracteres (char * segundo) respectivamente. Para la segunda matriz, usé

char* second = string1+n; 

Lo que me pregunto es cómo usar solo los primeros caracteres i en primero. No quiero asignar más memoria para las dos matrices, quiero manipular string1 para que solo apunte a partes de lo que ya está allí.

EDIT:

No puedo editar string1. ¿Puedo lanzar primero de alguna manera para acortar la longitud sin agregar un carácter nulo?

preguntado el 01 de febrero de 12 a las 03:02

En respuesta a su edición, no, debe copiarlo. Puedes usar strndup(), que toma una longitud, para copiar solo una cierta parte y tener memoria asignada automáticamente. -

2 Respuestas

A menos que asigne más memoria, no puede usar la "primera" como lo haría con cualquier otra cadena C (por ejemplo, pasándola a funciones de cadena, printf, etc.) porque no es nulo terminado en el límite con "segundo".

Ciertamente, en muchos casos aún puede evitarlo porque conoce la longitud, pero no hay nada mágico que pueda hacer aquí; el terminador nulo necesita un byte.

Respondido 01 Feb 12, 07:02

¿Puedo lanzar string1 de alguna manera para hacer que el puntero piense que solo tiene una longitud? - mrswmmr

No. No sé qué más decirte, no es así como funciona. - Brian Roach

Cadenas en C tiene que ser NULL-terminado, es decir, tener un \0 personaje al final de ellos. Si tuviera, por ejemplo, dos palabras divididas por un espacio, así:

char *str1 = "fat chance";

Podrías "dividirlos" reemplazando el espacio con \0:

str1[3] = '\0';

Y luego establece str2 para señalar después de la \0:

char *str2 = str1 + 4;

Sin embargo, si necesita dividir algo donde no hay un lugar conveniente para colocar un terminador, debe copiar la segunda parte de la cadena en otro lugar. La forma más fácil de hacer esto (si no le importa tener que hacerlo free() más tarde), es usar strdup()y poniendo un NULL terminador en str1 después:

char *str2 = strdup(str1 + 4);
str1[4] = '\0';

Respondido 01 Feb 12, 07:02

Supongo que strdup asigna memoria ya que necesito usar gratis más adelante, ¿correcto? - mrswmmr

@mrswmmr, sí señor. Te ahorra tener que usar malloc() tú mismo. - Dan Fego

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.