문제
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 자 미만이 남아 있으면 마지막 블록을 종료합니다.