2011-09-27 128 views
5

字符串我用C世界的新手,我有兩個可能愚蠢的問題。麻煩在C

我讀有關C結構和這裏是我卡住了。假設我們有這樣的結構

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" 

如何在這種情況下將文本傳遞到Ford.model?

我的第二個問題也是關於字符串。 此代碼工作正常

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

但是這一次不

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

任何人都可以解釋爲什麼它不工作?

+0

你的問題有絕對無關,與結構;這是關於字符串兩次的相同問題。 –

回答

0

您不能分配給=的字符數組,只能初始化它。

當你寫

char model[50] = "Focus"; 

這是一個初始化。

當你寫

model = ... 

這是一項任務。而且,正如我所說的,不允許賦值給字符數組。

您需要使用strcpy()(例如,)來複制字符數組。 strcpy(model, "Focus")

1

這(Ford.model = "Focus")是不可能的。您必須將字符串複製到在結構中的數組,最好用strcpy

strcpy(Ford.model, "Focus"); 

如果您STDLIB支持的話,你也應該考慮溢出安全的版本,如strncpy

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

在至少我認爲它是一個擴展功能,而不是標準...我不確定。

+0

它是標準的,但不是每個平臺都支持的C99標準。在Win32上,他們擁有它,但名爲'_snprintf'或'sprintf_s' – wormsparty

0

您可以定義過程中指定字符串,但其他地方你必須使用不同的方法,如strcpy()功能:

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

您可以在* definition *期間初始化**,而不是聲明。通常它們(聲明和定義)同時發生,但您可以將聲明與定義分開。 – pmg

4

有「把在對象中的值」方法有兩種:

  • 與初始化,創建
  • 與分配對象時,將創建該對象後

雖然語法相似,但它們表示不同的概念。

您可以初始化一個數組,但不能分配給它。

也有一個特殊的結構來初始化char陣列基於字符串文字

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

但是,assignement必須元素

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; 

一個「特殊」的方式來分配進行元素一個char數組一個接一個的元素與一個語句是使用庫函數strcpy()與原型PE在<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爲初學者提供更多信息! – niko