所以,你有兩個問題僞裝成一個單一的問題。
C的格式化I/O例程(printf
和fprintf
)根本不像Java的I/O例程。而不將項目的字符串,你使用格式字符串具有用於可變數據的佔位符,然後通過可變數據作爲附加參數:
printf("The average score is %d\n", grade/2);
的%d
是轉換符;它告訴printf
有一個附加參數,其類型爲int
,並且它應該被格式化爲一個數字序列。請注意,printf
依賴格式字符串中的轉換說明符來告訴它需要多少種類型的額外參數;如果您傳遞的參數對於給定的轉換說明符來說是錯誤的類型,或者沒有傳遞足夠的參數,那麼您會從亂碼輸出到徹底崩潰。如果傳遞的格式字符串調用的參數多於此參數,則會計算其他參數,但會被忽略。
請參閱您方便的C參考手冊,瞭解所有不同轉換說明符以及它們的使用方式。
至於字符串連接,C不具有字符串類型本身,也不具有串並置運算符。在C中,「字符串」是由0值字節終止的一系列字符值。字符串是存儲作爲char
陣列,例如:
char h[] = "hello";
char w[] = "world";
陣列h
包含值{'h', 'e', 'l', 'l', 'o', 0}
,和w
包含{'w', 'o', 'r', 'l', 'd', 0}
。要將字符串連接在一起,需要預留足夠大的目標緩衝區以保存兩個字符串。如果你有一個支持變長數組一個編譯器,你可以這樣做:
char result[ strlen(h) + strlen(w) + 2 ];
,否則你就必須動態地分配內存:
char *result = malloc(sizeof *result * (strlen(h) + strlen(w) + 2));
的+ 2
是必要的之間「的空間你好「和」世界「並終止0字節。
一旦你的目標緩衝器中,可以使用的strcpy
和strcat
的組合來寫入它:
strcpy(result, h);
strcat(result, " "); // note " " instead of ' '; the second argument *must* be a string
strcat(result, w);
或者可以使用sprintf
(其工作方式類似於printf
,但結果寫入到陣列的char
而不是流):
sprintf(result, "%s %s", h, w);
對於strcat
工作,必須已經有一個有效的,在目標緩衝區0結尾的字符串,這就是爲什麼我們開始用strcpy
編輯,它將在複製字符串的末尾附加一個0字節。空字符串包含單0值字節,所以我們也可以這樣做:
result[0] = 0; // or memset(result, 0, sizeof result), which sets the whole buffer to 0
strcat(result, h);
strcat(result, " ");
strcat(result, w);
strcat
查找終止0字節,並與下一個字符串的開始將其覆蓋,然後追加一個0字節到結果的結尾。
1.字符串字面下一個出現彼此在編譯的預處理階段被連接,所以你可以寫類似printf("start of string " A_STRING_MACRO " end of string\n");
,和預處理後,它看起來像`的printf(「字符串的開始無論在字符串\ n「的宏結尾),但沒有運行時串聯運算符。
閱讀C格式字符串的概念,它看起來像是什麼讓你感到困惑? – 2014-10-08 13:43:54
在C中,沒有'String'類型,只有字節數組被解釋爲字符。 「字符串」的結尾由零字節指定。因此,無論何時你想'連接字符串',你'連接'兩個字節數組。這可以通過顯式分配足夠容量的新內存塊並在其中移動源數組的內容來完成。如果需要,顯式釋放()源數組。 – 2014-10-08 13:44:10