簡體   English   中英

strcat 和覆蓋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM