C - read string from buffer of certain size
I have a char buf[x]
, int s
and void* data
.
I want to write a string of size s
into d开发者_StackOverflowata
from buf
.
How can I accomplish it?
Thanks in advance.
Assuming that
- by “string” you mean a null-terminated string as is normally meant in C;
- you haven't yet allocated memory in
data
; - you already know that s <= x
First you need to allocate memory in data
. Don't forget the room for the 0
byte at the end of the string.
data = malloc(s+1);
if (data == NULL) {
... /*out-of-memory handler*/
}
Assuming malloc
succeeds, you can now copy the bytes.
EDIT:
The best function for the job, as pointed out by caf, is strncat
. (It's fully portable, being part of C89.) It appends to the destination string, so arrange for the destination to be an empty string beforehand:
*(char*)data = 0;
strncat(data, buf, s);
Other inferior possibilities, kept here to serve as examples of related functions:
If you have
strlcpy
(which is not standard C but is common on modern Unix systems; there are public domain implementations floating around):strlcpy(data, buf, s+1);
If you know that there are at least
s
characters in the source string, you can usememcpy
:memcpy(data, buf, s);
((char*)data)[s+1] = 0;
Otherwise you can compute the length of the source string first:
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;
Or you can use
strncpy
, though it's inefficient if the actual length of the source string is much smaller thans
:strncpy(data, buf, s); ((char*)data)[s+1] = 0;
If data
is not allocated:
char buf[] = "mybuffer";
void *data = malloc(strlen(buf)+1);
strcpy((char*)data,buf);
Actually if data is really to be defined you can also do
char buf[] = "mybuffer";
void *data= (void*)strdup(buf);
memcpy(data, buf, s);
This assumes that you have enough space in data (and in buf).
Depending on what you are doing (you don't say, but you do say that you are copying strings), you may want to add a null at the end of your newly copied string if you did not copy a null already in buff, and you are going to use data in a function that expects strings.
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';
精彩评论