[英]strcat & Override
我在幾個網站上閱讀了 strcat() C 庫 function 的文檔。
我還在這里閱讀過: Strcat() 是否覆蓋或移動 null?
但是,還有一個問題——strcat() function 是否可以用來覆蓋目標字符串中的字符(假設目標字符串有足夠的空間存放源字符串,所以不會出錯)?
我運行了以下代碼,發現它無法覆蓋目標字符串的字符...
char dest[20] = "Hello World";
char src[] = "char";
strcat(dest+1, src);
printf("dest: %s", dest);
假設目標是有一個包含:“Hchar World!”的目標字符串。
(我知道 strcat() 還將 NULL 字符('\0')復制到目標字符串,所以如果調用 printf() function,它應該打印 Hchar,因為我錯誤地認為會發生......)。
這可能與 strcat() 相關嗎? 如果不是, strcpy() 是問題的答案嗎?
例如,如果在字符串中間有一個 '\0'(NULL 字符)的賦值,strcat() 是否總是會處理它遇到的第一個 '\0'(NULL 字符)? 我的意思是,如果我有:
char str[] = "Hello";
str[2]= 0;
strcat(str, "ab");
我只是想確定並澄清誤解。 我會很高興閱讀解釋。
strcat
將在dst
末尾寫入src
字符串。 如果你想用 strcat 覆蓋dst
,你首先需要在你想覆蓋它的地方使dst
“結束”。
看看這個代碼示例:
#include <stdio.h>
#include <string.h>
int main()
{
char dst[20] = "Hello world";
char src[] = "char";
dst[1] = '\0';
strcat(dst, src);
printf("%s\n", dst);
return (0);
}
但是,這不是strcat
的目的,正如評論中所說,在這里使用strcpy
會更合適。
#include <stdio.h>
#include <string.h>
int main()
{
char dst[20] = "Hello world";
char src[] = "char";
strcpy(dst + 1, src);
printf("%s\n", dst);
return (0);
}
如評論中所述, strcat
function 將始終(嘗試) append作為其第二個參數(傳統上稱為src
)給出的字符串作為其第一個參數( dest
); 如果任一字符串不是以空值結尾或目標緩沖區不夠大,它將產生未定義的行為。
cppreference 站點提供了比您鏈接的網站更好的文檔(C 和 C++)。 從該站點的strcat
頁面:
(1) …字符
src[0]
替換了dest
末尾的 null 終止符。 生成的字節字符串以空值結尾。
和:
筆記
因為
strcat
需要在每次調用時尋找到dest
的末尾,所以使用strcat
將許多字符串連接成一個是低效的。
因此,在您顯示的代碼中,調用strcat(dest+1, src);
與調用strcat(dest, src);
. 但是,調用strcpy(dest+1, src);
將產生您想要的結果(打印Hchar
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.