簡體   English   中英

C字符串類型定義

[英]C string type definition

我只是想寫一個像字符串類似的字符串:

string s;

我想這樣做:

#define string char *

然后例如在main函數中我只需要寫string s; 如果我鍵入不同的變量名稱,那么它不起作用。

我如何改進定義,或者如果這樣做的話,我怎么能用“typedef”來完成這項工作。 或者有更好的方法來制作變量類型的字符串嗎?
我在搜索,但我想我找不到答案。

不能在C中創建string類型的變量,因為“string”不是一個類型。

根據定義,“字符串”是“由第一個空字符終止並包括第一個空字符的連續字符序列”。 它不是數據類型,而是數據格式。

char數組可能包含一個字符串。 char*可以指向一個字符串。 它們都不字符串。

如果您願意,可以定義

typedef char *string; /* not recommended */

但這是誤導,因為我提到的char*類型的變量不是字符串。

最好的做法是直接使用char* 這清楚表明你的變量是一個指針。 它也與標准庫的定義方式一致; 例如, strlen函數聲明為:

size_t strlen(const char *s);

它也與大多數有經驗的C程序員編寫處理字符串的代碼的方式一致。

由於C處理數組的方式(或多或少作為二等公民),數組(包括包含字符串的數組)通常通過指向其元素的指針進行操作。 我們可以使用指針算法遍歷數組。 假裝指針數組,或者它一個字符串,是誘人的,似乎可以使代碼更容易理解,但從長遠來看,它只會引起混淆。

像宏的方法

#define string char*

甚至比typedef更糟糕。 宏被擴展為令牌序列; 處理器不知道C聲明的語法。 所以鑒於上面的定義,這個:

string x, y;

擴展到

char* x, y;

它將x定義為char* ,將y定義為char 如果你需要一個類型的名字, typedef幾乎總是比#define

您必須了解預處理器是什么。 至於你的問題,正確的解決方案是

typedef char *string;

如果你想使用預處理器刪除半冒號和這樣的s

#define string char *

在第二種情況下,預處理器將使用char *替換每個string出現,因此如果您聲明

string x, y;

它會擴展到

char *x, y;

其中x如果指向chary的指針只是一個char ,這是誤導性的,應該避免。

還有一件事,當在C中工作時,隱藏一些變量是指針的事實絕不是一個好主意,所以就像這樣

typedef SomeType *SomeTypeName;

其中SomeType可以是任何類型,通常是一個壞主意,你可以做一些我已經看到的澄清這一點的東西,你可以將P附加到SomeType ,就像這樣

typedef SomeType *SomeTypeP;

但我個人更喜歡*到任何這些typedef

別。 string是一個C ++關鍵字。 如果涉及到C ++,它不僅會引起問題,更重要的是,它會引起混淆並隱藏你正在處理指針的事實。

更新:合適的人,這不是關鍵字。 但是,如果你using namespace std;許多人using namespace std; 在您的代碼中, string是標准庫中的C ++類。

我想說的是,為char *創建一個別名並不常見,它可能會讓看到你代碼的其他人感到困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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