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);