我正在嘗試復制函式 strcat。問題是我的陣列 src 正在被修改,即使我只是用它來復制。
#include <stdio.h>
char *ft_strcat(char *dest, char *src)
{
int i = 0;
int c = 0;
while (dest[i] != '\0')
i ;
while (src[c] != '\0')
{
dest[i] = src[c];
c ;
i ;
}
dest[i] = '\0';
return dest;
}
int main(void)
{
char src[] = "_And Good Bye";
char dest[] = "Hello World";
char *ptr;
printf("\nString 1: %s\nString 2: %s\n", src, dest);
ptr = ft_strcat(dest, src);
printf("\nAfter strcat function.\nString 1: %s\nString 2: %s\n", src, dest);
return 0;
}
輸出:
String 1: _And Good Bye
String 2: Hello World
After strcat function.
String 1: And Good Bye
String 2: Hello World_And Good Bye
在我跑之后ft_strcat(dest, src),我的 charsrc失去了角色,"_". 我不明白為什么我只用它來復制。
我希望這src不會被修改。
uj5u.com熱心網友回復:
dest有足夠的記憶體來存盤"Hello World"。當您附加src到它時,您將覆寫相鄰的記憶體。相鄰的記憶體恰好包含src. 不能保證它會,但堆疊記憶體通常以這種方式分配。
例如,如果我列印出記憶體地址src并且dest我看到...
printf("src: %p\ndest: %p\n", &src, &dest);
src: 0x7ffeea74e31a
dest: 0x7ffeea74e30e
記憶是這樣的。
001111111111111111
ef0123456789abcdef
Hello World0_And Good Bye0
^ ^
dest src
當您將 src 連接到 dest 時,您會覆寫相鄰的記憶體,從而導致...
001111111111111111
ef0123456789abcdef
Hello World_And Good Bye00
^ ^
dest src
您需要分配dest有足夠的空間。
// "Hello World" "_And Good Bye" null byte
char dest[25] = "Hello World";
在實際程式中,您將 dest 分配為動態記憶體并重新分配它以獲得足夠的空間。
char *dest = malloc(12);
strcpy(dest, "Hello world");
dest = realloc(dest, strlen(dest) strlen(src) 1);
uj5u.com熱心網友回復:
C 中字串文字的實際型別是char [N],其中N是存盤字串字符(包括空終止位元組)所需的最小空間量。
如果您使用字串文字來初始化未知大小的陣列 ( char foo[] = ...),則結果陣列的型別與字串文字相同。
所以在,
char src[] = "_And Good Bye";
char dest[] = "Hello World";
src將有 typechar [14]和desttype char [12]。
知道了這一點,很明顯dest沒有足夠的空間來追加src(實際上是零多余記憶體)的內容。必須始終注意確保有足夠的空間,否則您將面臨Undefined Behavior的風險。
至少,您將需要char dest[25],盡管大幅超大目標緩沖區可能是謹慎的。
char dest[512] = "Hello World";
const char *src = "_And Good Bye";
以這種方式初始化dest會用零填充其其余記憶體。
uj5u.com熱心網友回復:
對于初學者,該函式應至少宣告為
char *ft_strcat(char *dest, const char *src);
因為源字串在函式內沒有改變。
在函式中,您嘗試將源字串附加到目標字串的末尾,但包含目標字串的陣列沒有足夠的記憶體來容納源字串,請參閱陣列的宣告
char src[] = "_And Good Bye";
char dest[] = "Hello World";
你需要擴大陣列dest。
例如你可以寫
char src[] = "_And Good Bye";
char dest[ 2 * sizeof( src )] = "Hello World";
int 型別的物件通常無法存盤所有可能長度的字串。例如函式strlen或運算子sizeof回傳型別的值size_t
事實上變數的宣告i和c
int i = 0;
int c = 0;
在函式中是多余的。
該功能可以如下所示
char * ft_strcat( char *dest, const char *src )
{
char *p = dest;
while ( *p ) p;
while ( ( *p = *src ) != '\0' );
return dest;
}
uj5u.com熱心網友回復:
嘗試在源引數中使用 Const 修飾符。這是我的第一點。
char *strcat(char *destination, const char *source)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448214.html
標籤:C
上一篇:為什么這不連接兩個字串?
下一篇:在C中,如何在呼叫vsnprintf()之前將可變數量的引數(比如50 )傳遞給va_start()理解的函式?
