문제

C 응용 프로그램에는 250의 일부로 분할되어 한 번에 더 많이 허용되지 않는 다른 응용 프로그램으로 보낼 수있는 숯불 배열이 있습니다.

어떻게할까요? 플랫폼 : Win32.

도움이 되었습니까?

해결책

MSDN 문서에서 :

strncpy 함수는 strsource의 초기 카운트 문자를 strdest로 복사하고 strdest를 반환합니다. 카운트가 strsource의 길이보다 작거나 같으면 널 문자는 복사 된 문자열에 자동으로 추가되지 않습니다. Count가 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;
    }

}

이제 블록은 종료 Null을 포함하여 250 자입니다. Strncpy는 249 자 미만이 남아 있으면 마지막 블록을 종료합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top