質問

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top