2011-09-27 24 views
5

Soy novato en el mundo C y tengo dos preguntas probablemente estúpidas.Problemas con cadenas en C

Estoy leyendo sobre estructuras en C y aquí es donde me quedé. Vamos a decir que tenemos una estructura como esta

typedef structs { 
    char model[50]; 
    int yearOfManufacture; 
    int price; 
} Car; 

Car Ford; 
Ford.yearOfManufacture = 1997; 
Ford.price = 3000; 

//The line below gives me an error "Array type char[50] is not assignable 
Ford.model = "Focus" 

¿Cómo pasar texto a Ford.model en ese caso?

Mi segunda pregunta es también acerca de las cadenas. Este código funciona bien

char model[50] = "Focus"; 
printf("Model is %s", model); 

Pero éste no

char model[50]; 
model = "Focus"; 

Puede alguien explicar por qué no funciona?

+0

Su pregunta no tiene absolutamente nada que ver con estructuras; es la misma pregunta sobre cuerdas dos veces. –

Respuesta

0

No puede asignar una matriz de caracteres con =, solo puede inicializarla.

Cuando se escribe

char model[50] = "Focus"; 

que es una inicialización.

Cuando se escribe

model = ... 

que es una asignación. Y, como dije, la asignación a matrices de caracteres no está permitida.

Debe copiar a la matriz de caracteres usando strcpy(), p. Ej. strcpy(model, "Focus").

1

Este (Ford.model = "Focus") no es posible. Tienes que copiar la cadena en la matriz de la estructura, mejor con strcpy:

strcpy(Ford.model, "Focus"); 

Si su stdlib lo soporta, también se debe considerar una versión segura de desbordamiento, por ejemplo strncpy:

strncpy(Ford.model, "Focus", sizeof Ford.model); 

En al menos creo que es una función de extensión y no en el estándar ... No estoy seguro.

+0

Es estándar, pero estándar C99, que no todas las plataformas admiten. En Win32 lo tienen, pero llamado '_snprintf' o' sprintf_s' – wormsparty

0

Puede asignar una cadena durante la definición, pero en ningún otro lugar hay que utilizar un método diferente, como la función strcpy():

char model[50]; 
strcpy(model, "Focus"); 
+0

Puede ** inicializar ** durante * definición *, no declaración. A menudo ellos (declaración y definición) ocurren al mismo tiempo, pero puede tener declaraciones separadas de la definición. – pmg

4

Hay dos maneras de "poner los valores en los objetos":

  • con la inicialización, cuando se crea el objeto
  • con asignación, después se crea el objeto

Aunque la sintaxis es similar, representan conceptos diferentes.

Puede inicializar una matriz, pero no puede asignarla.

También hay una construcción especial para inicializar char matrices basado en los literales de cadena

char arr[] = "foobar"; 
char arr[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'}; 
int arr[] = {1, 2, 3, 4}; 
// ... 

pero, asignacion debe ser elemento hecho por elemento

char arr[4]; 
arr[0] = arr[1] = arr[2] = 'X'; 
arr[3] = '\0'; 
int arr[4]; 
arr[0] = arr[1] = arr[2] = 42; 
arr[3] = -1; 

Una forma "especial" para asignar elementos de un char matrices uno a uno con una sola instrucción es usar la función de biblioteca strcpy() con prototipo EP en <string.h>

#include <string.h> 
int main(void) { 
    char arr[10]; 
    strcpy(arr, "foo"); // same as arr[0]='f'; arr[1]=arr[2]='o'; arr[3]='\0'; 
    return 0; 
} 
+1

+1 para poner más información para un principiante! – niko