Как извлечь n символов из массива char - PullRequest
4 голосов
/ 02 октября 2008

У меня есть массив символов в приложении C, который я должен разделить на части по 250, чтобы я мог отправить его в другое приложение, которое не принимает больше за один раз.

Как бы я это сделал? Платформа: win32.

Ответы [ 4 ]

4 голосов
/ 02 октября 2008

Из документации 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;
    }
}
1 голос
/ 02 октября 2008

Если вы стремитесь к производительности и вам разрешено немного коснуться строки (т. Е. Буфер не является константным, нет проблем с безопасностью потока и т. Д.), Вы можете на мгновение завершить строку нулем с интервалом 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;
}
1 голос
/ 02 октября 2008

Я могу думать о чем-то вроде следующего:

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);
}
0 голосов
/ 03 октября 2008

Ответ 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 символов, включая завершающий ноль. strncpy завершит последний блок null, если осталось менее 249 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...