質問
Cアプリケーションにchar配列があり、それを250の部分に分割して、一度にそれ以上受け入れない別のアプリケーションに送信できるようにします。
どうすればいいですか?プラットフォーム:win32
解決
MSDNドキュメントから:
strncpy関数は、strSourceの初期カウント文字をstrDestにコピーし、strDestを返します。 countがstrSourceの長さ以下の場合、コピーされた文字列にNULL文字は自動的に追加されません。 countがstrSourceの長さよりも大きい場合、宛先文字列は長さcountまでヌル文字で埋め込まれます。ソース文字列と宛先文字列が重複する場合、strncpyの動作は未定義です。
strncpy
は有効な宛先スペースをチェックしないことに注意してください。それはプログラマーに任されています。プロトタイプ:
char * strncpy(
char * strDest、
const char * strSource、
size_tカウント
);
拡張例:
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文字の間隔で文字列を一時的にnullで終了して送信できます元の文字列から直接、チャンク単位で:
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の答えは基本的に正しいです。ただし、彼がnullで終了した「ブロック」ではない点が異なります。コードは次のようになります。
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文字です。残りの文字数が249文字未満の場合、strncpyは最後のブロックをnullで終了します。