2011-09-27 15 views
5

Sono novizio nel mondo C e ho due domande probabilmente stupide.Problemi con le stringhe in C

Sto leggendo di strutture in C e qui è dove mi sono bloccato. Diciamo che abbiamo struttura come questa

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" 

Come passare il testo in Ford.model in quel caso?

La mia seconda domanda riguarda anche le stringhe. Questo codice funziona bene

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

Ma questo non

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

Qualcuno può spiegare perché non funziona?

+0

La tua domanda non ha assolutamente nulla a che fare con le strutture; è la stessa domanda sugli archi due volte. –

risposta

0

Non è possibile assegnare a un array di caratteri con =, è possibile solo inizializzarlo.

Quando si scrive

char model[50] = "Focus"; 

che è un'inizializzazione.

Quando si scrive

model = ... 

che è un incarico. E, come ho detto, l'assegnazione agli array di caratteri non è consentita.

È necessario copiare nell'array di caratteri utilizzando strcpy(), ad es. strcpy(model, "Focus").

1

Questo (Ford.model = "Focus") non è possibile. Bisogna copiare la stringa nella matrice nella struct, meglio con strcpy:

strcpy(Ford.model, "Focus"); 

Se lo stdlib lo supporta, si dovrebbe anche prendere in considerazione un overflow versione a sicurezza, ad esempio strncpy:

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

A Almeno penso che sia una funzione di estensione e non nello standard ... Non ne sono sicuro.

+0

È standard, ma standard C99, che non tutte le piattaforme supportano. Su Win32 ce l'hanno, ma chiamato '_snprintf' o' sprintf_s' – wormsparty

0

È possibile assegnare una stringa in fase di definizione, ma in qualsiasi altro luogo è necessario utilizzare un metodo diverso, come la funzione strcpy():

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

Puoi ** inizializzare ** durante * definizione *, non dichiarazione. Spesso (dichiarazione e definizione) accadono contemporaneamente, ma è possibile avere dichiarazioni separate dalla definizione. – pmg

4

Ci sono due modi per "mettere i valori in oggetti":

  • con inizializzazione, quando viene creato l'oggetto
  • con assegnazione, dopo che l'oggetto viene creato

Sebbene la sintassi sia simile, rappresentano concetti diversi.

È possibile inizializzare un array, ma non è possibile assegnarlo.

Inoltre c'è un costrutto speciale per inizializzare char array basato su stringhe

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

ma, assegnazione deve essere fatta elemento per 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; 

Un modo "speciale" per assegnare elementi di un array char uno per uno con una singola istruzione consiste nell'utilizzare la funzione di libreria strcpy() con il prototipo pe in <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 per mettere più informazioni per un principiante! – niko