[英]C - read string from buffer of certain size
我有一個char buf[x]
, int s
和void* data
。
我想將一個大小為s
的字符串寫入buf
data
。
我怎樣才能完成它?
提前致謝。
假如說
data
分配內存; 首先,您需要在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.