在研究 C 中的字串操作時,我遇到了一種與strcat(). 采取以下小程式:
#include <stdio.h>
#include <string.h>
int main()
{
char string[20] = "abcde";
strcat(string 1, "fghij");
printf("%s", string);
return 0;
}
我希望這個程式能列印出來bcdefghij。我的想法是,在 C 中,字串是字符陣列,陣列的名稱是指向其第一個元素的指標,即索引為零的元素。所以這個變數string是一個指向a. 但是,如果我計算string 1并將其用作與 連接的目標陣列strcat(),我會得到一個指向一個陣列元素(1 * sizeof(char)在本例中為 )的記憶體地址的指標,因此是指向b. 所以我的想法是,目標目標是以不可見的空字符開頭b(并以不可見的空字符結尾)的陣列,并且fghij連接起來,給我bcdefghij.
但這不是我得到的 - 程式的輸出是abcdefghij. 這與我得到的輸出完全相同strcat(string, "fghij");- 添加 1 tostring被忽略。我也得到了相同的輸出,加上另一個數字,例如 strcat(string 4, "fghij");,就此而言。
有人可以向我解釋為什么會這樣嗎?我最好的猜測是它與 運算子的系結優先級有關,但我不確定這一點。
編輯:我增加了原始陣列的大小,char string[20]以便它在任何情況下都足夠大以容納連接的字串。輸出仍然相同,我認為這意味著陣列溢位不是我問題的關鍵。
uj5u.com熱心網友回復:
char string[] = "abcde";
strcat(string 1, "fghij");
將五個字符附加到一個完整的字串陣列。轟隆隆。未定義的行為。
向字串陣列添加一些內容是一種性能優化,它告訴運行時該字串已知至少有那么多字符長。
您似乎認為字串是它自己的東西而不是陣列,并且strcat正在對其第一個引數做一些事情。不是這樣的。字串是陣列*;strcat 正在修改陣列內容。
*有人會過來聲稱堆分配的字串不是陣列。OP 還沒有處理堆。
uj5u.com熱心網友回復:
陣列是不可修改的左值。例如你可能不會寫
char string[20] = "abcde";
char string2[] = ""fghij"";
string = string2;
在運算式中使用的具有罕見例外的陣列被隱式轉換為指向其第一個元素的指標。
例如,如果您要撰寫,string 1則不會更改陣列的地址。
在這次通話中
strcat(string 1, "fghij");
陣列字串的元素從陣列的第二個元素開始被覆寫。
在這份宣告中
printf("%s", string);
從第一個字符開始輸出整個陣列(再次將用作引數的陣列指示符轉換為指向其第一個元素的指標)。
你可以寫例如
printf("%s", string 1);
在這種情況下,陣列從其第二個元素開始輸出。
uj5u.com熱心網友回復:
您將獲得 的輸出abcdefghij,因為您的呼叫strcat并未更改 的地址string(您也無法更改它 - 在宣告它的塊的持續時間內它是固定的,就像任何其他變數的地址一樣)。您傳遞給的是陣列的第二個元素的strcat地址:但這仍被解釋為以 - 結尾的字串的地址,呼叫將第二個(源)引數附加到該地址。將第二個引數的內容附加到, or將在陣列中產生相同的結果,只要在索引處或之后有 - 終止符。stringnulstringstring 1string nstringnuln
要列印您實際傳遞給strcat呼叫的字串的值(即,從'b'字符開始),您可以保存呼叫的回傳值并列印:
#include <stdio.h>
#include <string.h>
int main()
{
char string[20] = "abcde";
char* result = strcat(string 1, "fghij"); // strcat will return the "string 1" pointer
printf("%s", result); // bcdefghij
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470606.html
上一篇:在c中使用定義效率低下?
