char *tempMonth;
char month[4];
month[0]='j';
month[1]='a';
month[2]='n';
month[3]='\0';
cómo asignar mes a tempMonth? graciasasignar un valor de cadena al puntero
y cómo imprimirlo finalmente?
gracias
char *tempMonth;
char month[4];
month[0]='j';
month[1]='a';
month[2]='n';
month[3]='\0';
cómo asignar mes a tempMonth? graciasasignar un valor de cadena al puntero
y cómo imprimirlo finalmente?
gracias
tempmonth = malloc (strlen (month) + 1); // allocate space
strcpy (tempMonth, month); //copy array of chars
recuerde:
include <string.h>
En C, month == &month[0]
(en la mayoría de los casos) y éstas equivalen a un puntero char *
o carácter.
Así que usted puede hacer:
tempMonth=month;
Esto señalará el puntero sin asignar tempMonth
para apuntar a los bytes literales asignados en las otras 5 líneas de su puesto.
Para realizar una cadena literal, sino que también es más sencilla de hacer esto:
char month[]="jan";
alternativa (aunque no se le permite modificar los personajes de éste):
char *month="jan";
El el compilador asignará automáticamente la longitud del literal en el lado derecho del month[]
con una cadena C NULL terminada adecuada y month
apuntará al literal.
imprimirlo:
printf("That string by golly is: %s\n", tempMonth);
Es posible que desee revisar C strings and C string literals.
solo algunas sugerencias: cambie '=' a '==' en la primera línea y deje en claro que 'month == & month [0]' _mostly._ No es así cuando se usa sizeof u otras características del lenguaje. – paxdiablo
sí, de acuerdo .... –
@paxdiablo: Sí, buenas ediciones. Gracias. –
tempMonth = month
Cuando asigna un valor a un puntero, es un puntero, no una cadena. Al asignar lo anterior, no tendrá milagrosamente dos copias de la misma cadena, tendrá dos punteros (month
y tempMonth
) apuntando a la misma cadena .
Si lo que desea es una copia - tiene que asignar memoria (usando malloc
) y luego en realidad copiar los valores (utilizando strcpy
si es una cadena terminada en cero, memcpy
o un bucle de otra manera).
Se podría hacer algo como:
char *months[] = {"Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", "Aug","Sep","Oct", "Nov", "Dec"};
y obtener acceso
printf("%s\n", months[0]);
Si lo que desea es una copia del puntero , que puede utilizar:
tempmonth = month;
pero eso significa que ambos apuntan a los mismos datos subyacentes: cambie uno y esto afecta a bo th.
Si quieres cadenas independientes, hay una buena probabilidad de que su sistema tendrá strdup
, en cuyo caso se puede utilizar:
tempmonth = strdup (month);
// Check that tempmonth != NULL.
Si su aplicación qué no tienen strdup
, get one:
char *strdup (const char *s) {
char *d = malloc (strlen (s) + 1); // Allocate memory
if (d != NULL) strcpy (d,s); // Copy string if okay
return d; // Return new memory
}
Para imprimir cadenas de forma formateada, observe la familia printf
aunque, para una cadena simple como esta que va a la salida estándar, puts
puede ser lo suficientemente bueno (y probablemente más eficiente).
#include "string.h" // or #include <cstring> if you're using C++
char *tempMonth;
tempMonth = malloc(strlen(month) + 1);
strcpy(tempMonth, month);
printf("%s", tempMonth);
Algunos dirían que, si usas 'printf' o' malloc', entonces no podrías estar usando C++, estás atascado en el purgatorio esperando la conversión completa :-) – paxdiablo
true. aún puedes incluir C libs. nunca sabes ;) –
Hay un desbordamiento de búfer esperando a suceder. Siempre use 'strncpy', y asegúrese de que tempMonth apunte a la memoria asignada correctamente. –
No te recomendé pero creo que tu asignación debe ser para 'strlen (month) + 1'. 'sizeof (tempmonth)' es el tamaño del _pointer._ – paxdiablo
oh. tienes razón. lo siento – Freaktor