关于使用 fwrite 写入字符数组的正确方法的新手问题?

Novice question concerning proper method of writing a character array using fwrite?

在下面的缩略功能代码中,请问fwritestdout两个版本有什么重要区别吗?

如果*n是指向字符数组的指针,l是要写入的字符数,是否需要先复制字符串,然后用[的第三个参数写入=15=],如第一个 if 的第二个 fwrite?或者可以排除copy,使用第二组fwrite,这里第三个参数是len?

如果相关,字符数组n是一个JSON字符串,需要是UTF-8。

谢谢。

int writeout( char *n, int l )    
  {    
    const uint32_t len = l > 0 ? l : strlen( n );    
    char msg[ len ];    
    strncpy( msg, n, len ); 
    
    if ( fwrite( &len, sizeof len, 1, stdout ) != 1    
        || fwrite( msg, sizeof msg, 1, stdout ) != 1 )    
      {
      }
    
    if ( fwrite( &len, sizeof len, 1, stdout ) != 1    
        || fwrite( n, sizeof( char ), len, stdout ) != len )    
      {
      }

    return 0;
  } 

在用fwrite写入之前不需要将字符串复制到本地数组。这样做实际上是一种浪费。在你的函数中,

char msg[ len ];
strncpy( msg, n, len ); 
// ...
fwrite( msg, sizeof msg, 1, stdout )

应该会产生与

完全相同的输出
fwrite( n, len, 1, stdout );

可能产生与

相同的输出
fwrite( n, 1, len, stdout );

,也是,但在那种情况下,后者将 return 一个与前者不同的值 (len) 给调用者 (1),因为第二个参数决定单元的大小fwrite 传输和计算数据项。