سؤال

ولدي مجموعة شار في تطبيق C الذي يجب أن تنقسم إلى أجزاء من 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);
}

إذا كنت تسعى للحصول على أداء وكنت يسمح للمس سلسلة قليلا (أي المخزن المؤقت لا CONST، أي قضايا السلامة موضوع الخ)، هل يمكن أن حظات خالية إنهاء سلسلة على فترات من 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 حرفا بما فيها لاغية تنتهي. سوف strncpy فارغة إنهاء كتلة الماضي إذا كان هناك أقل من 249 الأحرف المتبقية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top