4

C アプリケーションに char 配列があり、250 の部分に分割して、一度にそれ以上受け入れない別のアプリケーションに送信できるようにする必要があります。

どうすればいいですか?プラットフォーム: win32。

4

4 に答える 4

4

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;
    }
}
于 2008-10-02T15:03:18.573 に答える
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);
}
于 2008-10-02T15:05:22.983 に答える
1

パフォーマンスを追求し、文字列に少し触れることが許されている場合 (つまり、バッファーが 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;
}
于 2008-10-02T15:17:26.620 に答える
0

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 で終了します。

于 2008-10-03T03:40:29.533 に答える