簡體   English   中英

C - 從特定大小的緩沖區讀取字符串

[英]C - read string from buffer of certain size

我有一個char buf[x]int svoid* data

我想將一個大小為s的字符串寫入buf data

我怎樣才能完成它?

提前致謝。

假如說

  • “字符串”是指 C 中通常表示的以空字符結尾的字符串;
  • 你還沒有在data分配內存;
  • 你已經知道 s <= x

首先,您需要在data分配內存。 不要忘記字符串末尾的0字節的空間。

data = malloc(s+1);
if (data == NULL) {
    ... /*out-of-memory handler*/
}

假設malloc成功,您現在可以復制字節。

編輯

正如strncat所指出的,這項工作的最佳功能是strncat (它是完全可移植的,是 C89 的一部分。)它附加到目標字符串,因此事先將目標安排為空字符串:

*(char*)data = 0;
strncat(data, buf, s);

其他較低的可能性,保留在這里作為相關功能的示例:

  • 如果你有strlcpy (這不是標准的 C,但在現代 Unix 系統上很常見;有一些公共領域的實現):

     strlcpy(data, buf, s+1);
  • 如果您知道源字符串中至少有s字符,則可以使用memcpy

     memcpy(data, buf, s);

    ((char*)data)[s+1] = 0;

  • 否則,您可以先計算源字符串的長度:

     size_t bytes_to_copy = strlen(buf); if (bytes_to_copy > s) bytes_to_copy = s; memcpy(data, buf, bytes_to_copy); ((char*)data)[s+1] = 0;
  • 或者您可以使用strncpy ,但如果源字符串的實際長度遠小於s ,則效率低下:

     strncpy(data, buf, s); ((char*)data)[s+1] = 0;

如果未分配data

char buf[] = "mybuffer";
void *data = malloc(strlen(buf)+1);
strcpy((char*)data,buf);

實際上,如果真的要定義數據,您也可以這樣做

char buf[] = "mybuffer";
void *data= (void*)strdup(buf);
memcpy(data, buf, s);

這假設您有足夠的數據空間(和 buf)。

根據您在做什么(您沒有說,但您確實說您正在復制字符串),如果您沒有在 buff 中復制空值,您可能希望在新復制的字符串末尾添加空值,並且您將在需要字符串的函數中使用數據。

data = malloc(s);
strcpy((char*)data,buf);
free(data);
int n = MIN((x - 1), s);
char *bp = buf;
char *dp = (char *)data;
while (n--) {
  *bp++ = *dp++;
}
*dp = '\0';

暫無
暫無

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

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