C アプリケーションに char 配列があり、250 の部分に分割して、一度にそれ以上受け入れない別のアプリケーションに送信できるようにする必要があります。
どうすればいいですか?プラットフォーム: win32。
MSDN ドキュメントから:
strncpy 関数は、strSource の初期カウント文字を strDest にコピーし、strDest を返します。count が strSource の長さ以下の場合、null 文字はコピーされた文字列に自動的に追加されません。count が strSource の長さより大きい場合、変換先の文字列は長さ count まで null 文字で埋められます。ソース文字列と宛先文字列が重複している場合、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 文字の間隔で文字列を一時的に 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;
}
}
そのため、ブロックは終端の null を含めて 250 文字になりました。strncpy は、残りの文字数が 249 文字未満の場合、最後のブロックを null で終了します。