2014-10-08 45 views
1

我目前正在學習C課程,在習慣了Java之後,我似乎不明白C中的連接方式是如何完成的。在Google中進行搜索並不能解決問題,因爲大部分代碼I看到如何連接像"Hello" + "World"實際的字符串。串聯如何在C中工作?

在Java中,說我想在一個線來連接算術表達式,我可以很容易地只使用+運營商,但在C,我能看到一些熟悉的東西的唯一的地方是這樣的:

int grade; 
scanf("%d", &grade); 

我可以理解,grade變量正在作爲輸入,但如果我想用這個變量使用+&運算符執行算術運算,我會得到錯誤。這裏是什麼,我試圖做一個例子:

printf("The average score is "& grade/2 & ""); 

甚至會返回一個錯誤,當我使用+運營商,但在Java正常工作:

System.out.println("The average score is " + grade/2 + ""); 

我可以理解,它們是不同的語言,但是不是+&運營商應該用於連接在C也?

+2

閱讀C格式字符串的概念,它看起來像是什麼讓你感到困惑? – 2014-10-08 13:43:54

+1

在C中,沒有'String'類型,只有字節數組被解釋爲字符。 「字符串」的結尾由零字節指定。因此,無論何時你想'連接字符串',你'連接'兩個字節數組。這可以通過顯式分配足夠容量的新內存塊並在其中移動源數組的內容來完成。如果需要,顯式釋放()源數組。 – 2014-10-08 13:44:10

回答

4

號+和&,並非用於C.級聯不管怎樣,在C,你通常會使用strncat爲串聯char *(一個或多個),但你的問題似乎是打印有關。對於這一點,你應該這樣做

printf("The average score is %d\n", grade/2); 
+0

謝謝Elliott,如果我有其他部分的字符串添加到輸出中,我仍然使用'''符號?比如'printf(「平均分數是%d \ n」,等級/ 2,「..良好等級!」);' – 2014-10-08 13:45:58

+1

您還需要使用正確的[格式字符串](http://en.wikipedia。 org/wiki/Printf_format_string#1970s:_C.2C_Lisp),第二個將是'printf(「平均分數是%d%s \ n」,等級/ 2,「......良好等級!」);'注意格式字符串中的「%s」。 – 2014-10-08 13:48:50

+0

@ geek.x格式字符串後面的printf參數數量應該與格式字符串中的格式說明符數量匹配(無論如何都是最簡單的情況)。所以如果你想添加一個額外的字符串參數,你需要在你的格式字符串中添加一個'%s'。但是你可以直接將字符串添加到格式字符串中('printf(「...是%d。\ n ...好成績!\ n」,grade/2);'),這會更有意義。 – sepp2k 2014-10-08 13:50:57

0

在您的例子

printf("The average score is "& grade/2 & ""); 

&操作符用來得到任何變量的內存地址,所以當你試圖打印只是一個正常的INT變量,那&不是必需的。

你可以做這樣的事情

printf("The average score is %d", (grade/2)); 

%d在使用printf來匹配您提供

+2

'&'在這裏用於中綴位置,所以它不需要任何東西的地址 - 這是位和明智的操作符。 – sepp2k 2014-10-08 13:46:38

+0

@ sepp2k:順便問他這個問題,我以爲他和''scanf'和'printf'裏的'&'混淆了 – Haris 2014-10-08 13:48:27

+0

你的printf有一個錯字;) – 2014-10-08 14:13:43

2

在java中+標誌是用來連接字符串如變量:

 
      System.out.println("hello"+","+" "+"World");

它只是一個粗略的方式來顯示字符串連接。這個非常主要的是在java中可能的,因爲 +運算符用於藝術數學運算,並且 +被重載以連接字符串。

但是在C +符號應該只執行藝術數學而不是重載連接。

因此,在C到打印輸出的最佳方法是使用格式化的打印聲明:printf的

printf("String <format specifier>",arg1,arg2,...);
有關打印語句的更多細節。Click Here

0

你的java的概念,但是所有的語言都沒有語法一樣,所以我的建議是你第一次閱讀C語言的輸入輸出操作,在C語言&用於獲取變量的內存地址,所以你不能用它來騙取兩個字符串類型的工作,在java中'+'可以用來連接兩個字符串它是高級語言,所以你可以這樣做,但是在c中是不可能的,在c中使用%d來從內存中獲取變量。 因此,您的輸出代碼將爲:

`printf(「平均分數爲%d」,(等級)/ 2);

2

所以,你有兩個問題僞裝成一個單一的問題。

C的格式化I/O例程(printffprintf)根本不像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字節。

一旦你的目標緩衝器中,可以使用的strcpystrcat的組合來寫入它:

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「的宏結尾),但沒有運行時串聯運算符。