【问题标题】:string concatenation with strncat leads to error in signedness使用 strncat 进行字符串连接会导致符号错误
【发布时间】:2010-07-01 07:44:10
【问题描述】:

更新:char、signed char 还是 unsigned 的问题最终在这里没有意义。在这种情况下使用 memcpy 更合适,因为它不分青红皂白地处理字节。

不可能是一个更简单的操作,但我似乎错过了一个关键步骤。在下面的代码中,我试图用buffer 填充bufferdata,编译器会警告我签名存在差异。

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;    
 }
}

【问题讨论】:

  • 你真的在读字符串吗?如果是这样,'buffer' 应该是 char。如果没有,你不应该使用 strncat
  • +1。如果 nuls 猖獗,它们真的不是字符串。切换到 memcpy 并解决问题。

标签: c string char concatenation signedness


【解决方案1】:

显然在您的编译器中charsigned char,因此是警告消息。

【讨论】:

  • 错了。如果您想要未解释的字节,则必须使用 unsigned char,因为只有 unsigned char 和无符号位域才能保证是纯二进制表示。
【解决方案2】:
char * strncat ( char * destination, char * source, size_t num );

因为你的目标缓冲区是无符号字符,所以会有一个符号警告。如果不需要签名,您可以将缓冲区更改为 char 数组,否则您可以在编译器中使用 -w 选项忽略警告。

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2023-03-15
    • 2018-07-14
    相关资源
    最近更新 更多