No se puede concatenar la variable de salida de strtok. Strcat y Strtok

He pasado horas en este progtwig y he puesto varias horas en línea buscando alternativas a mis métodos y he estado plagado de accidentes y errores toda la noche …

Tengo algunas cosas que me gustaría lograr con este código. Primero explicaré mis problemas, luego publicaré el código y finalmente explicaré mi necesidad del progtwig.

El progtwig genera solo las palabras y la función concatenar no hace nada. Esto parece que debería ser lo suficientemente simple para arreglar …

Mi primer problema es que parece que no consigo que la función de concatenar funcione, usé la función strcat genérica que no funcionó y tampoco otra versión que encontré en internet (esa función se usa aquí, se llama “mystrcat” ). Quiero que el progtwig se lea en una cadena y elimine los “delimitadores” para crear una sola cadena compuesta por cada palabra dentro de la cadena original. Estoy tratando de hacer con strtok y una función strcat. Si hay una manera más fácil o más simple POR FAVOR, soy todo oídos.

Otro problema, que no es necesariamente un problema, sino un desagradable lío: las siete líneas siguientes son las principales. Preferiría inicializar mis variables de la siguiente manera: variable char [amt]; pero el código que encontré para strtok estaba usando un puntero y el código para la función strcat estaba usando punteros. Una mejor comprensión de los punteros y las direcciones de las cadenas probablemente me ayude a largo plazo. Sin embargo, me gustaría deshacerme de algunas de esas líneas por cualquier medio necesario. No puedo tener 6 líneas dedicadas a solo 2 variables. Cuando tengo 10 variables no quiero 30 líneas arriba …

#include  #include  #include  char *mystrcat(char *output, char *firstptr); int main() { char str[] = "now # is the time for all # good men to come to the # aid of their country"; char delims[] = "# "; char resultOrig[70]; //was [20]; char firstOrig[20]; //char *result = NULL, *first = NULL; char result = resultOrig; //was result = &resultOrig; char first = firstOrig; //was first = &firstOrig; first = strtok( str, delims ); while( first != NULL ) { mystrcat(resultOrig, firstOrig); printf( "%s ", first ); printf("\n %s this should be the concat\'d string so far\n", resultOrig); first = strtok( NULL, delims ); } system("pause"); return 0; } char *mystrcat(char *resultptr, char *firstptr) { char *output = resultptr; while (*output != '\0') output++; while(*firstptr != '\0') { *output = *firstptr; output++; firstptr++; } *output = '\0'; return output; } 

Este es solo un progtwig de prueba en este momento, pero tenía la intención de usarlo para una lista / base de datos de archivos. Mis archivos tienen guiones bajos, guiones, puntos, paréntesis y números; Todos los cuales me gustaría establecer como los “delimitadores”. Estaba planeando ir a través de un bucle, donde eliminaría un delimitador (cada cambio de bucle de _ a – a. Etc …) y crearía una sola cadena, es posible que desee reemplazar los delimitadores con un espacio o un punto. Y algunos archivos ya tienen espacios junto con los caracteres especiales que me gustaría “delimitar”.

Estoy planeando hacer todo esto mediante el escaneo de un archivo de texto. Dentro del archivo también tengo un tamaño en este formato: “2,518,6452”. Espero poder ordenar mi base de datos alfabéticamente o por tamaño, ascendente o descendente. Esa es solo una información adicional que puede ser útil conocer para mis preguntas específicas arriba.

A continuación, he incluido algunas muestras ficticias de cómo podrían aparecer estos nombres. my_file (2009) .ext segundo.File-group1.extls the.third.file-vol30.lmth

Estoy enfocando esta publicación en: la pregunta sobre cómo hacer que funcione la función de concatenar o una alternativa a strcat y / o strtok. Además de pedir ayuda para despejar el código innecesario o redundante.

Agradezco toda la ayuda e incluso a todos aquellos que leyeron mi publicación.

Muchas gracias!

strcat funcionaría si usara first lugar de firstOrig en su bucle. No hay necesidad de mystrcat . Se puede simplificar para:

 #include  #include  int main() { char str[] = "now # is the time for all # good men to come to the # aid of their country"; char delims[] = "# "; char result[100] = ""; /* Original size was too small */ char* token; token = strtok(str, delims); while(token != NULL) { printf("token = '%s'\n", token); strcat(result, token); token = strtok(NULL, delims); } printf("%s\n", result); return 0; } 

Salida:

 token = 'now' token = 'is' token = 'the' token = 'time' token = 'for' token = 'all' token = 'good' token = 'men' token = 'to' token = 'come' token = 'to' token = 'the' token = 'aid' token = 'of' token = 'their' token = 'country' nowisthetimeforallgoodmentocometotheaidoftheircountry 

Hay varios problemas aquí:

  1. resultOrig faltantes de resultOrig y firstOrig (como se indica en el código).

  2. first = &firstOrig no hace lo que quieres de él. Más tarde, haces first = strtok(str, delims) , que establece first para apuntar a algún lugar en str . No lee datos en firstOrig .

  3. Asigna pequeños búferes (solo 20 bytes) e intenta llenarlos con mucho más que esto. Se desbordaría la stack. causando errores desagradables.

No has inicializado las siguientes dos cadenas:

 char resultOrig[20]; char firstOrig[20]; 

y les estás agregando caracteres. Cambiarlos a:

 char resultOrig[20] = ""; char firstOrig[20] = ""; 

También el nombre de la matriz de caracteres da su dirección de inicio. Asi que

 result = &resultOrig; first = &firstOrig; 

debiera ser:

 result = resultOrig; first = firstOrig; 

Cambio

 mystrcat(resultOrig, firstOrig); 

a

 mystrcat(resultOrig, first); 

También haga que resultOrig sea ​​lo suficientemente grande como para contener las concatenaciones, como:

 char resultOrig[100] = "";