variable concatenate and c string char concat

concatenate - jstl concat string and variable



C-Cuerdas Concat (6)

Intentando concatenar cadenas (* char) usando C y teniendo muchas fallas de segmentación:

void printDateFormat( char *in ) { /* begin function printDateFormat */ char *month; // month by char int month_int; // month by digit char *day; // day by char char *year; // year by char char *dateToken; // date token in split char *formatted; // formatted string dateToken = strtok (in, "/"); month = &dateToken; formatted = formatted = getMonth(month); dateToken = strtok (NULL, "/"); day = &dateToken; formatted = strcat (formatted, day); formatted = strcat (formatted, ", "); dateToken = strtok (NULL, "/"); year = &dateToken; formatted = strcat (formatted, year); in = *formatted; } /* End function printDateFormat */ char *getMonth( int d) { /* begin function *getMonth */ switch (d) { case 1: return "January"; // break; case 2: return "February"; // break; case 3: return "March"; // break; case 4: return "April"; // break; case 5: return "May"; // break; case 6: return "June"; // break; case 7: return "July"; // break; case 8: return "August"; // break; case 9: return "September"; // break; case 10: return "October"; // break; case 11: return "November"; // break; case 12: return "December"; // break; } } /* End function *getMonth */

Se espera la entrada en printDateFormat () como otra cadena en el formato: MM / dd / aaaa ... es decir. 31/03/2013. El propósito es convertirlo en: 31 de marzo de 2013.

EDITAR:

Así es como paso a printDateFormat

void option1( void ) { /* begin function option1 */ char date[10]; /*user input date string */ printf("/n/nEnter date [Format: MM/dd/yyyy]: "); fgets(date, 10, stdin); scanf("%s", &date); printDateFormat(date); printf("/n%s", date); } /* End function option2 */

EDICION 2:

Ok, hice algunos cambios pero aún no hay dados ...

aquí está mi advertencia de compilación:

asgn9.c: In function `printDateFormat'': asgn9.c:224: warning: passing arg 1 of `getMonth'' makes integer from pointer without a cast asgn9.c:237: warning: assignment makes pointer from integer without a cast

se refieren al uso de getMonth() dentro de mi printDateFormat()

Aquí está mi código actualizado, todavía tengo un error de segmentación en el mismo lugar ...

void printDateFormat( char *in ) { /* begin function printDateFormat */ char *month; // month by char int month_int; // month by digit char *day; // day by char char *year; // year by char char *dateTkn; // date token in split char *formatted; // formatted string dateTkn = strtok (in, "/"); month = dateTkn; formatted = getMonth(month); dateTkn = strtok (NULL, "/"); day = dateTkn; formatted = strcat (formatted, day); formatted = strcat (formatted, ", "); dateTkn = strtok (NULL, "/"); year = dateTkn; formatted = strcat (formatted, year); in = *formatted; } /* End function printDateFormat */ char *getMonth( int d) { /* begin function *getMonth */ static char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; return strcpy(malloc(32), months[d]); } /* End function *getMonth */


C no es un lenguaje para el procesamiento de cadenas. Si puede, use C ++ y std :: string.

Una forma de hacer esto en C es definir un char buffer[BUFFERSIZE] grande char buffer[BUFFERSIZE] para copiar las dos cadenas en el fin de concatenarlas. ¡Ten cuidado de no sobrepasar el buffer!

También puede malloc / liberar el búfer, pero ese es otro conjunto de dolores de cabeza.


El valor devuelto por

getMonth(month);

es un punto a una cadena constante . No puede modificar esta cadena, incluido strcat (). Puede cambiar la función para cumplir con su requerimiento como:

char formatted[MAXSIZE]; // formatted string getMonth(month, formatted); void getMonth( int d, char *cache) { /* begin function *getMonth */ switch (d) { case 1: strcpy(cache, "January"); return; ...... }

Después de eso, puede continuar modificando el contenido en la matriz de caracteres "formateada".


No ha asignado ninguna memoria para el formato. Cambiar la declaración de formateado a

char formatted[80];

y cambie la primera asignación a formateada para

strcpy ( formatted, getMonth ( month ), sizeof ( getMonth ( month ) ) );

y deberías estar bien.


Puede resolver algunos de sus problemas y simplificar el código con:

char *getMonth(int d) { static char *months[] = { "January", "February", "March", . . . }; return strcpy(malloc(60), months[d]); }

De esta manera,

  • el valor de retorno es escribible
  • tiene espacio adicional para tus operaciones strcat ()

Para la fuerza industrial, es posible que desee comprobar el valor de retorno de malloc() , ver si n está dentro del rango, y cosas por el estilo.


Supongamos que su publicación es correcta, entonces los problemas son

month = &dateToken; .... day = &dateToken; .... year = &dateToken;

strtok return char *, así que simplemente elimine y de cada ''dateToken''. Y su prototipo de entrada ''getMonth'' es de tipo ''int'', pero usted le da a la función el tipo ''char *'', la tabla ''switch'' no reconocerá el caso de la tabla sin dígitos.


Your getMonth devuelve un puntero a un literal de cadena. Intentar modificarlo (por ejemplo, con strcat ) no está permitido; conduce a un comportamiento indefinido.

Sugeriría (fuertemente) usar strftime para manejar la fecha del formato y / o las cadenas de tiempo para imprimir. Esto no solo reducirá su código de formato a una línea, sino que también le permitirá respaldar resultados localizados cuando / si lo desea también.

Editar: si no puedes usar strftime , querrás construir una fecha formateada en tu propio buffer, probablemente usando sprintf :

char buffer[256]; static const char *months[] = { "January", "February", /* ... */ , "November", "December" }; sprintf(buffer, "%s %d %d", months[monthnum], day, year);