簡體   English   中英

c語言中的字符串

[英]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 中,你只能初始化數組,不能賦值,字符數組也不例外。

您將需要使用字符串復制函數,如strcpystrncpy等。

但是,您可以將字符串封裝在結構中並模擬:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM