2012-11-15 67 views
0

是否可以使用指針創建字符串變量?所以我不必每次都要傳遞它的大小,比如char x [4] =「aaa」?ANSI C - 計算字符串指針的大小

如何獲得此類字符串的大小?

我可以用指針初始化一個空字符串嗎?

+0

有什麼機會可以澄清這一點嗎? – mathematician1975

+0

當你說「通過它的大小」你的意思是我假設的函數參數? – WhozCraig

+0

2啤酒+大量的剪切和粘貼,哈哈,對不起,已編輯:P – user1615069

回答

8

請記住,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字節。然而,當你使用其他數據類型時,這是一個很好的習慣,它可以使你的意圖非常清晰,從而使你的代碼自動記錄。

+0

您能提供任何用malloc初始化的例子嗎? – user1615069

+0

@ user1615069我已更新我的示例。 –

+0

+1,但更好地添加const:const char * x =「hello」;所以你不能分配x解引用。 –

1

如果你初始化的char數組用於字符串,你不需要指定大小:

char str[] = "This is a test"; 

這將創建strchar有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到。