我在C应用程序中有一个char数组,我必须将其分成250个部分,以便我可以将它发送到另一个不能同时接受更多的应用程序。
我该怎么做?平台:win32。
答案 0 :(得分:4)
来自MSDN文档:
strncpy函数将strSource的初始计数字符复制到strDest并返回strDest。如果count小于或等于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;
}
}
答案 1 :(得分:1)
我可以想到以下几点:
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);
}
答案 2 :(得分:1)
如果您努力提高性能并且允许稍微触摸字符串(即缓冲区不是常量,没有线程安全问题等),您可能会以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;
}
答案 3 :(得分:0)
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。如果剩余少于249个字符,strncpy将为null终止最后一个块。