簡體   English   中英

將字節復制到緩沖區,從 C 中緩沖區的第 n 個字節開始

[英]Copy bytes to buffer starting from nth byte of buffer in C

我是 C 的新手,習慣了更高級別的語言,如 JS 和 Python。我正在嘗試將一些字節復制到另一個字節串中的某個 position。

例如,如果我試圖從目標字符串的第 3 個字節開始將 src 字符串復制到目標字符串中,它將如下所示:

src = "888"
dest = "Hello World!"
result = "He888 World!"

基本的復制,你知道你想復制多少字節,你想從哪里取出它們,你想把它們放在哪里,可以用memcpy完成:

#include <string.h>
char const* src = "888";
char dest[] = "Hello World!";

memcpy(&dest[2], src, 3);

// dest now contains "He888 World!"

這將 3 個字節從src復制到&dest[2] (開始后兩個字節)。 與 C 中的大多數內容一樣,由您來確保操作有效。

如果src的長度是可變的,你可以使用strlen來找到它的長度:

char const* src = "1234";
char dest[] = "Hello World!";

memcpy(&dest[2], src, strlen(src));

// dest now contains "He1234World!"

如果你想將結果作為兩個輸入的單獨字符串生成,你可以分配 memory 作為字符串的副本,並在進行任何更改之前使用strdup復制它(這個 memory 必須用free釋放):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char const* src = "1234";
char const* dest = "Hello World!";
char* result = strdup(dest);

if (result == NULL) {
    fputs("failed to allocate memory\n", stderr);
    return EXIT_FAILURE;
}

memcpy(&result[2], src, strlen(src));

// result now contains "He1234World!"

free(result);

如果不能以其他方式保證src適合dest ,您將體驗到避免 integer 溢出的美妙世界:

size_t offset = 2;

if (offset > strlen(dest) || strlen(src) > strlen(dest) - offset) {
    fprintf(
        stderr,
        "src (%zu bytes) is too long to copy into dest (%zu bytes) at offset %zu",
        strlen(src), strlen(dest), offset
    );
    return EXIT_FAILURE;
}

memcpy(&result[offset], src, strlen(src));

希望這不是您的目的所必需的。

您可以嘗試將其逐字節復制到目標字符串。

 strcpy(result, dest);
    
 for(int i = start; i < strlen(src); i++)
 {
     result[i] = src[i - start];
 } 

start 是你的第 n 個字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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