конкатенация строк с помощью strncat приводит к ошибке подписи - PullRequest
0 голосов
/ 01 июля 2010

обновление: точка ли полукокс, подписанный полукокса, или без знака, в конечном счете спорная здесь. в этой ситуации более целесообразно использовать memcpy, поскольку он работает без разбора на байтах.

Не может быть более простой операцией, но я, похоже, упускаю важный шаг. В следующем коде я пытаюсь заполнить bufferdata buffer, для которого компилятор предупреждает меня о разнице в подписи.

unsigned char  buffer[4096] = {0};
char *bufferdata;

bufferdata = (char*)malloc(4096 * sizeof(bufferdata));

if (! bufferdata)
  return false;

while( ... )
{
    // nextBlock( voidp _buffer, unsigned _length );
 read=nextBlock( buffer, 4096);

 if( read > 0 )
 {

  bufferdata = strncat(bufferdata, buffer, read); // (help)
  // leads to: pointer targets in passing argument 2 of strncat differ in signedness.

  if(read == 4096) {

   // let's go for another chunk
   bufferdata = (char*)realloc(bufferdata, ( strlen(bufferdata) + (4096 * sizeof(bufferdata)) ) );
   if (! bufferdata) {
    printf("failed to realloc\n");
    return false;
   }

  }

 }
 else if( read<0 )
 {
  printf("error.\n");
  break;
 }
 else {
  printf("done.\n");
  break;    
 }
}

Ответы [ 2 ]

1 голос
/ 01 июля 2010
char * strncat ( char * destination, char * source, size_t num );

, поскольку в качестве целевого буфера используется беззнаковый символ, поэтому будет предупреждение о знаке.Вы можете изменить свой буфер на массив символов, если подпись не нужна, иначе вы можете игнорировать предупреждения, используя опцию -w в компиляторе.

1 голос
/ 01 июля 2010

Очевидно, что в вашем компиляторе char равно signed char, таким образом, предупреждение.

...