2011-04-18 10 views

Respuesta

1
tempmonth = malloc (strlen (month) + 1); // allocate space 
strcpy (tempMonth, month);    //copy array of chars 

recuerde:

include <string.h> 
+0

Hay un desbordamiento de búfer esperando a suceder. Siempre use 'strncpy', y asegúrese de que tempMonth apunte a la memoria asignada correctamente. –

+0

No te recomendé pero creo que tu asignación debe ser para 'strlen (month) + 1'. 'sizeof (tempmonth)' es el tamaño del _pointer._ – paxdiablo

+0

oh. tienes razón. lo siento – Freaktor

10

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.

+0

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

+0

sí, de acuerdo .... –

+0

@paxdiablo: Sí, buenas ediciones. Gracias. –

2
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).

0

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

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

1
#include "string.h" // or #include <cstring> if you're using C++ 

char *tempMonth; 
tempMonth = malloc(strlen(month) + 1); 
strcpy(tempMonth, month); 
printf("%s", tempMonth); 
+0

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

+0

true. aún puedes incluir C libs. nunca sabes ;) –

Cuestiones relacionadas