我想使用獲取字串的第一個字符strncpy,這是我的代碼
int main() {
char s[] = "abcdefghi";
char c[] = "";
printf("%c\n",c);
printf("%s\n",s);
strncpy(c,s,1);
printf("%c\n",c);
printf("%s\n",s);
return 0;
}
問題是c仍然是一個空字串,有什么問題嗎?
uj5u.com熱心網友回復:
問題在于它c是一個陣列(它會衰減為一個指標),而 的%c格式printf()需要一個字符。如果在函式需要字符時傳遞指標,則會得到未定義的行為,并且可能的輸出將是陣列地址的第一個位元組,被解釋為 ASCII 字符。
另外,請注意,它char c[] = "";只是宣告了一個長度為 1 的陣列,其中包含空 ( \0) 字符。如果您嘗試列印它,就像您在代碼中所做的那樣,您可能會得到奇怪的輸出。
如果c僅用于存盤單個字符,請將其宣告為一個簡單char變數,并將其地址傳遞給strncpy():
char s[] = "abcdefghi";
char c = ' ';
printf("%c\n", c);
printf("%s\n", s);
strncpy(&c, s, 1); //notice the & before c
printf("%c\n", c);
printf("%s\n", s);
但是,您必須小心。傳遞任何大于 1 的值都會strncpy()帶來大麻煩,因為您將寫入未定義的位置。
uj5u.com熱心網友回復:
s 是一個包含 10 個字符的陣列,c 是一個包含一個字符的陣列。你明白為什么嗎?哪個字符存盤在 c 中?
%s 是字串的格式,%c 是字符的格式。但是 c 不是字符。包含一個字符的陣列是一個陣列,而不是一個字符。因此,當您嘗試列印 c 時,您會得到垃圾。
現在不好: strncpy 在你的情況下不會產生一個 C 字串,因為沒有足夠的空間來容納一個。如果您嘗試用 %c 列印 c ,您會得到胡說八道。如果您嘗試使用 %s 列印它,則會出現未定義的行為。不要使用 strncpy 除非你真的知道它在做什么(你通常應該避免使用 strncpy)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368928.html
標籤:C
