Как извлечь n символов из массива char
Вопрос
У меня есть массив символов в приложении на языке Си, который я должен разделить на части по 250, чтобы я мог отправить его другому приложению, которое не принимает больше за один раз.
Как бы я это сделал?Платформа:win32.
Решение
Из документации MSDN:
Функция strncpy копирует начальное количество символов strSource в strDest и возвращает strDest. Если число меньше или равно длине strSource, пустой символ не добавляется автоматически к скопированной строке. Если число больше, чем длина strSource, строка назначения дополняется нулевыми символами вплоть до длины счета. Поведение strncpy не определено, если исходная и целевая строки перекрываются. Р>
Обратите внимание, что strncpy
не проверяет правильность места назначения; это оставлено на усмотрение программиста. Прототип:
char * strncpy (
char * strDest,
const char * strSource,
size_t count
);
Код>
Расширенный пример:
void send250(char *inMsg, int msgLen)
{
char block[250];
while (msgLen > 0)
{
int len = (msgLen>250) ? 250 : msgLen;
strncpy(block, inMsg, 250);
// send block to other entity
msgLen -= len;
inMsg += len;
}
}
Другие советы
Я могу думать о чем-то вроде следующего:
char *somehugearray;
char chunk[251] ={0};
int k;
int l;
for(l=0;;){
for(k=0; k<250 && somehugearray[l]!=0; k++){
chunk[k] = somehugearray[l];
l++;
}
chunk[k] = '\0';
dohandoff(chunk);
}
Если вы стремитесь к производительности и вам разрешено немного коснуться строки (т. е. буфер не является константным, нет проблем с безопасностью потока и т. д.), вы можете на мгновение завершить строку нулем с интервалом 250 символов и отправить это кусками, прямо из исходной строки:
char *str_end = str + strlen(str);
char *chunk_start = str;
while (true) {
char *chunk_end = chunk_start + 250;
if (chunk_end >= str_end) {
transmit(chunk_start);
break;
}
char hijacked = *chunk_end;
*chunk_end = '\0';
transmit(chunk_start);
*chunk_end = hijacked;
chunk_start = chunk_end;
}
ответ jvasaks в основном правильный, за исключением того, что у него нет завершающегося нулем "блока".Код должен быть таким:
void send250(char *inMsg, int msgLen)
{
char block[250];
while (msgLen > 0)
{
int len = (msgLen>249) ? 249 : msgLen;
strncpy(block, inMsg, 249);
block[249] = 0;
// send block to other entity
msgLen -= len;
inMsg += len;
}
}
Итак, теперь блок состоит из 250 символов, включая завершающий null.strncpy завершит последний блок обнулением, если осталось менее 249 символов.