是否可以使用指針創建字符串變量?所以我不必每次都要傳遞它的大小,比如char x [4] =「aaa」?ANSI C - 計算字符串指針的大小
如何獲得此類字符串的大小?
我可以用指針初始化一個空字符串嗎?
是否可以使用指針創建字符串變量?所以我不必每次都要傳遞它的大小,比如char x [4] =「aaa」?ANSI C - 計算字符串指針的大小
如何獲得此類字符串的大小?
我可以用指針初始化一個空字符串嗎?
請記住,C中的字符串以空終止符字符結尾,寫爲\0
。
char *x = "hello"; // automatically appends a null terminator
int len = 0;
while (x[len] != '\0') {
len++;
}
如果你的變量初始化或以其他方式不能很好地形成(例如,通過爲NULL
:如果您有存儲在您的指針變量構造良好的字符串,你可以因此通過搜索這個角色確定長度)你顯然不能採取這種方法;然而,大多數函數通常是在字符串爲的假設下編寫的,因爲這會導致代碼更快。
如果您希望初始化指針,您有三個選項:NULL
,有效地址(例如,char *x = &someCharVar
)或字符串常量(例如,char *x = "hello"
)。請注意,如果您使用字符串常量,則您需要寫入非法,除非您使用非常量字符串的地址重新分配給它。
// Get enough space for 24 characters plus null terminator
char *myString = (char*) malloc(25 * sizeof(char));
strcpy(myString, "some text"); // fill the new memory
fgets(myString, 25, stdin); // fill with keyboard input
注意sizeof(char)
沒有必要在這裏,因爲char
總是被定義爲正好爲1字節。然而,當你使用其他數據類型時,這是一個很好的習慣,它可以使你的意圖非常清晰,從而使你的代碼自動記錄。
您能提供任何用malloc初始化的例子嗎? – user1615069
@ user1615069我已更新我的示例。 –
+1,但更好地添加const:const char * x =「hello」;所以你不能分配x解引用。 –
如果你初始化的char
數組用於字符串,你不需要指定大小:
char str[] = "This is a test";
這將創建str
爲char
有15個元素的數組(大小取自initiliazer的長度,包括0終止符),並將字符串文本的內容複製到它。
一個字符串的類型是「的char
N元件陣列」(const char
在C++)的陣列表達。除用於在聲明中初始化數組(如上)或者是運算符sizeof
或一元運算符&
的操作數外,「T
」數組的表達式將被轉換爲「指向T
「,並且表達式的值將是數組的第一個元素的地址。
如果寫
const char *str = "This is a test";
表述「這是一個測試」是從類型爲「指針char
」「的char
15元件陣列」轉換,並且表達式的值是地址的第一個字符,寫入變量str
。
試圖修改字符串文字內容的行爲是undefined;有些平臺將字符串文字存儲在只讀存儲器中,有些平臺不會。有些將相同字符串文字的多次出現映射到單個實例,而另一些則不會。最好始終將字符串字面量視爲不可修改的,這就是爲什麼我將str
標爲const char *
而不是char *
。
得到一個字符串的長度,使用strlen
:
char str[] = "This is a test"; // or const char *str = "This is a test";
size_t len = strlen(str); // or strlen("This is a test");
這將返回字符串中的字符數最多(但不包括)終止0; strlen("This is a test")
將返回14
要獲得包含字符串緩衝區的大小,你可以使用sizeof
操作:
char str[] = "This is a test";
size_t len = sizeof str; // or sizeof "This is a test"
注意這不會給你緩衝,如果大小你宣佈str
爲指針,如
const char *str = "This is a test";
在這種情況下,sizeof str;
只給你一個char *
的大小,而不是它的POI的字符串nts到。
有什麼機會可以澄清這一點嗎? – mathematician1975
當你說「通過它的大小」你的意思是我假設的函數參數? – WhozCraig
2啤酒+大量的剪切和粘貼,哈哈,對不起,已編輯:P – user1615069