2010-08-31 96 views
4

我正在通過「Learn C」書閱讀,並且遇到了一個我真不明白的問題。在練習的要點是找到這段代碼的問題:基本C指針問題

char c; 

c = 'a'; 

printf("c holds the character %c.",c); 

..和那麼它給出的解釋是:「文本字符串‘a’是由兩個字符,這兩個‘A’和終止零字節變量c只有一個字節的大小,即使c是2字節長,也不能以這種方式拷貝一個文本字符串,嘗試一次拷貝一個字節的文本到足夠大的變量中該文本字符串及其終止的零字節。「

但是,當我運行上面的代碼 - 它工作得很好。我想我明白爲什麼的背後它是壞的理論 - 將整體在一串東西年底終止0,所以我改寫這樣的代碼進行測試:

char c[2]; 

*c = 'a'; 

printf("c holds the character %c.",c); 

但是,這產生一個問題。我開始對這個問題感到困惑。這第二組代碼是不是將字母'a'傳遞給c [0]處的指針,然後將終止0置於c [1] - 完全使用分配給該數組的2個空格?

+3

我不假設在第二行有一個雙引號? (c =「a」;)這將無法編譯...因爲單引號是一個字符,而任何用雙引號是一個字符串(所以以null結尾) – Rudu 2010-08-31 21:16:05

+0

你的第一個例子是100%正確的,沒有問題用它。你確定你把它正確地複製了嗎? – 2010-08-31 21:16:23

+0

謝謝你們,你是對的 - 書中的例子有雙引號。但他們沒有提到答案中指出的一點,即雙引號是空字符結束的,單引號只是一個字符。謝謝。 – startuprob 2010-08-31 21:28:04

回答

8

該文本是錯誤的,否則你正在抄寫代碼不正確。

在C中,雙引號字符串以空值終止。單引號字符只是一個字符。

+0

該文本最多有點誤導,但它是正確的。 – jdehaan 2010-08-31 21:51:13

+1

它給出的代碼沒有問題。如果這本書說用正確的代碼找到一個「問題」,那麼這本書是錯誤的。 – 2010-08-31 22:23:59

2

在C中,單引號表示字符常量。

9

的解釋:「文本字符串‘a’是由兩個字符,這兩個‘A’和結尾的零字節

這是真實的,但'a'"a"'a'爲單個字符,所以'a'char非常適合

一個寫一個字符轉換成字符串應該是這樣的例子:。

char str[2]; 
str[0] = 'a'; 
str[1] = 0; /* because nothing guarantees array items are initialized to 0 */ 
printf("str holds the string %s.", str); 
2

在你的第二個例子的代碼段,c被解釋爲指針的第一個元素的陣列中(即作爲char *),而不是作爲char。你既可以做:

printf("c holds the character %c.", *c); 

printf("c holds the character %c.", c[0]); 

printf("c holds the character %s.", c); 

在最後一個示例中,%s告訴printf()期待一個字符串,而不是一個字符。但是,在這種情況下,您必須將c[]的第二個元素設置爲「空終止符」(例如使用c[1] = '\0'),否則printf()將不知道字符串結束的位置,並且可能會打印無限量的垃圾。

0

在C中,'c'是單個字符,而「c」是字符串。 (注意雙引號)。本書作者對佔用2個字節的變量的解釋僅適用於第二種情況。

在您的第一個代碼段中,您將一個完全有效的1字節char分配給char變量並進行打印。所以它工作。

在你的第二個代碼段中,你將一個字符賦值給char數組(如果你想把它稱爲一個字符串)而不是'null-terminating'它。當你調用它的printf函數時,printf不知道字符串在哪裏結束。因此printf的行爲在這裏未定義。

0

本書所示的解釋有些不對勁。 'a'是單個字符(注意單引號),「a」是一個字符串。 現在「a」確實是0x00終止。但'一個'不是。

我現在的結論是,當你從書中複製信息時出現亂碼......或者......「學習C」這個標題是本書作者的目標。

1

C中的字符串實際上是字符數組。所以char c [2];是c的聲明,它是一個包含2個元素的字符數組。用'a'分配它是錯誤的,因爲它是一個字符文字,你應該給它分配一個字符串文字「a」。只要記住早先評論所述的單引號和雙引號之間的區別。

0

在C單引號描述單個字符,即 'A' 而在雙引號 「一個」 它彌補了空teminated串

所以這

int main(void) 
{ 
    char s[2]="a"; 

    // s='a'; leads to error incompatible types......... 
    printf("%s",s); 

    return 0; 
} 

將正常工作

0

在單引號C中編寫一個字符:'a'和雙引號中的一個字符'a'具有不同的含義。

通過將一個字符放在單引號中,表示要將'a'解釋爲一個單個字符,因此不會添加終止的空字節。

如果您要將您的角色放在雙引號內,那麼它將被聲明爲一個字符串。在這種情況下,終止空字節會自動連接到結尾,您不必擔心。生成的字符串是:

"a/0"

如果你想你的str變量初始化字符串「一」只使用單引號,那麼你就必須在明確添加終止空字節。

char str[2]; 
str[0] = 'a'; 
str[1] = '/0'; 
printf("str holds the string %s.", str); 

否則,您可以使用雙引號將str的第一個索引初始化爲「a」,並且終止空字節將自動添加到第二個索引處。

char str[2]; 
str[0] = "a";