[英]Strings in c programming
為什么我無法編譯包含代碼的程序
char name[10];
name= "Rajesh";
雖然我能夠編譯一個程序
char name[10]="Rajesh";
那是因為您的代碼片段沒有執行聲明,而是執行:
char name[10]; // Declaration
name= "Rajesh"; // Assignment.
數組在 C 中不能直接賦值。
名稱name
實際上解析為其第一個元素 ( &name[0]
) 的地址,它不是左值,因此不能成為賦值的目標。
字符串變量聲明和賦值
字符串變量可以像其他數組一樣聲明:
char phrase[14];
字符串數組可以在聲明的同時初始化或部分初始化,使用括在“{}”大括號中的值列表(其他數據類型的數組也是如此)。 例如,聲明
char phrase[14] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};
兩者都聲明數組“短語”並將其初始化為狀態。 該聲明
char phrase[14] = "Enter age: ";
是等價的。 如果省略“14”,將創建一個足夠大的數組,以包含值““Enter age:”和標記字符“'\\0'”,以便兩個語句
char phrase[] = {'E','n','t','e','r',' ','a','g','e',':',' ','\0'};
char phrase[] = "Enter age: ";
彼此等價,也等價於語句
char phrase[12] = "Enter age: ";
然而,重要的是要記住字符串變量是數組,所以我們不能只使用運算符“=”和“==”進行賦值和比較。 例如,我們不能簡單地寫
phrase = "You typed: "; //Wrong way
相反,我們可以使用一組特殊的函數進行字符串賦值和比較。
編輯:
另一種方法是使用指針來做到這一點: -
聲明變量
char const *phrase; /* a pointer to type character */
並將變量初始化為您想要的位置,如
phrase = "Test string";
不能使用賦值為字符串數組賦值。
在 C 中,你只能初始化數組,不能賦值,字符數組也不例外。
您將需要使用字符串復制函數,如strcpy
或strncpy
等。
但是,您可以將字符串封裝在結構中並模擬:
typedef struct Yourstring Yourstring;
struct Yourstring
{
char a[24];
};
Yourstring a = { "abcd" };
Yourstring b = a;
Yourstring c = { 0 };
c = b;
char name[10];
在第一個示例中,您將name
聲明為一個包含 10 個字符的數組。 符號name
現在被解釋為這個數組的起始地址,但同時可以寫入到陣列,你不能移動的符號name
。 所以這:
name= "Rajesh";
將意味着將name
遠離您聲明的數組並指向存儲在內存中其他地方的字符串文字"Rajesh"
的位置。 你不能這樣做。
你可以做的是:
strcpy(name, "Rajesh");
它將您的字符串文字從可執行文件中的不可變位置復制到您聲明的 char 數組中,或者:
char const *pointer_to_name = "Rajesh";
它不復制任何內容,而只是將不可變字符串文字的地址存儲到您可以使用它的變量中,或者您的第二個示例:
char name[10]="Rajesh";
它將name
聲明為一個包含 10 個字符的數組並對其進行初始化。
char name[10];
name= "Rajesh";
這里name
是一個字符數組。 簡單name
基本上是指向數組第一個元素的指針,不能像上面的語句那樣賦值。
我的觀點是
字符名稱[10]; 名稱=“拉傑什”;
說明:這不是數組的正確聲明。 字符串只不過是以 '\\0' 運算符終止的字符集合。 因此,數組索引(在這種情況下是'name' ,基本上指向數組中第一個字符的地址,即 name 保存了 'Rajesh' 中字符 'R' 的地址。
如果你想像上面提到的那樣初始化,更好的方法可能是:
字符名稱[10]; *name="拉傑什";
現在,上面的聲明不會拋出任何錯誤,但它仍然會拋出警告,例如:
賦值從指針生成整數而無需強制轉換 [-Wint-conversion] *name = "Rajesh"
AS char name[10]="Rajesh"
是定義編譯器了解您要做什么並糾正您的錯誤。 在 C++ 中,用 "" 編寫的字符串是常量,一些編譯器將它們放入 stringpools 以節省空間。 name="...."
表示您試圖將一個常量分配給一個不允許的非常量指針。
您應該使用 strcpy 將字符串復制到數組中。
char name[10] ="Rajesh";
這是一個數組初始化。 編譯器知道它。 這是一招式。 只有在定義變量時才能使用它。 它相當於:
char name[10] = { 'R', 'a', 'j', 'e', 's', 'h', '\0' };
另一個是非法的,因為您不能在數組定義之外使用數組初始化。
我不記得我在哪里讀過它,但 C 標准說,你可以在定義時為數組分配一個字符串值,但不能在定義之后。
char a[10]="rajesh" its a defination hence works
char a[10];a="rajesh"; fails its not a defination
相反,您需要使用 strcpy(a,"rajesh") 為字符串賦值,如果它不是定義
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.