C中的字符串流

Sai*_*aid 12 c string stdio stream

print2fp(const void *buffer, size_t size, FILE *stream) {

 if(fwrite(buffer, 1, size, stream) != size)
  return -1;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何将数据写入字符串流而不是文件流?

cma*_*ter 10

posix 2008标准中有一个非常简洁的功能:open_memstream().你这样使用它:

char* buffer = NULL;
size_t bufferSize = 0;
FILE* myStream = open_memstream(&buffer, &bufferSize);

fprintf(myStream, "You can output anything to myStream, just as you can with stdout.\n");
myComplexPrintFunction(myStream);    //Append something of completely unknown size.

fclose(myStream);    //This will set buffer and bufferSize.
printf("I can do anything with the resulting string now. It is: \"%s\"\n", buffer);
free(buffer);
Run Code Online (Sandbox Code Playgroud)

  • 是否有一个很好的替代`open_memstream`?许多平台(其中的solaris)还没有提供这个[尚未]. (2认同)

Eli*_*uge 4

使用sprintf: http: //www.cplusplus.com/reference/cstdio/sprintf/

这是参考文献中的一个示例:

#include <stdio.h>

int main ()
{
  char buffer [50];
  int n, a=5, b=3;
  n = sprintf(buffer, "%d plus %d is %d", a, b, a+b);
  printf("[%s] is a string %d chars long\n", buffer, n);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

[5 plus 3 is 8] is a string 13 chars long
Run Code Online (Sandbox Code Playgroud)

根据评论中的建议进行更新:

使用snprintf它是因为它更安全(它可以防止缓冲区溢出攻击)并且更便携。

#include <stdio.h>

int main ()
{
  int sizeOfBuffer = 50;
  char buffer[sizeOfBuffer];
  int n, a = 5, b = 3;
  n = snprintf(buffer, sizeOfBuffer, "%d plus %d is %d", a, b, a+b);
  printf ("[%s] is a string %d chars long\n", buffer, n);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,snprintf第二个参数实际上是允许使用的最大大小,因此您可以将其设置为低于 的值sizeOfBuffer,但是对于您的情况,这是不必要的。snprintf只写入sizeOfBuffer-1字符并使用最后一个字节作为终止字符。

这是文档的链接snprintfhttp://www.cplusplus.com/reference/cstdio/snprintf/

  • 或者可移植代码中的“snprintf”。另外,请不要链接到 cplusplus.com,该网站充满错误。cppreference.com 更好。 (4认同)
  • 不要使用 sprintf(),实际上任何 sprintf() 的使用都会在一段时间内发生爆炸。使用 asprintf() 代替,它会为您分配所需长度的缓冲区。 (2认同)