我对sprintf的理解是将需要的内容打印到一个字符串中。MSDN上的例子是这样的:#include <stdio.h>void main( void )
{
   char  buffer[200], s[] = "computer", c = 'l';
   int   i = 35, j;
   float fp = 1.7320534f;   /* Format and print various data: */
   j  = sprintf( buffer,     "\tString:    %s\n", s );
   j += sprintf( buffer + j, "\tCharacter: %c\n", c );
   j += sprintf( buffer + j, "\tInteger:   %d\n", i );
   j += sprintf( buffer + j, "\tReal:      %f\n", fp );   printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );
}我想问的是:
    buffer是字串,j是数,怎么可以加起来呢?最后得到的buffer怎么又会是累加的数据呢?

解决方案 »

  1.   

    buffer是一个char 数组,当它用作sprintf的时候你可以理解会字符串,当它用来加的时候,你可以把他理解为指针
      

  2.   

    因为在这里buffer是指针,当然可以和j相加。
    buffer和j相加表示的是从buffer这个位置开始的第j个字符的指针(也就是buffer[j]的地址)!
    如题:
    j  = sprintf( buffer,     "\tString:    %s\n", s ); 把数据拷贝到buffer中,j表示一共拷贝了多少字节到buffer中。
    j += sprintf( buffer + j, "\tCharacter: %c\n", c ); 把数据拷贝到buffer+j开始的缓冲区中,这时j则等于到现在为止一共拷贝了多少数据到以buffer开始的缓冲区中。
    以下类推!
      

  3.   

    那么_vsntprintf和sprintf有什么区别呀?函数为什么有的前面有一个下划线?和没有下划线的有什么区别?
      

  4.   

    vsntprintf比sprintf安全, 因为它有越界检查。有一个下划线是为了说明这不是标准函数吧。出了VC就不能用了。
      

  5.   

    _vsntprintf 是一个为了方便Unicode而定义的宏,你可以用右键go to difinition查看的,如果还是个宏,可以再点下去
    像sprintf的UNICODE宏定义是_stprintf
    strcpy ===> _tcscpy
      

  6.   

    windows 中可以使用sprintf及sprintf系列中的其它函数来显示文字,
    sprintf函式定义如下:
    int sprintf (char * szBuffer, const char * szFormat, ...) ;
        第一个参数是字符缓冲区;后面是一个格式字符串。Sprintf不是将格式化结果标准输出,而是将其存入szBuffer。该函式返回该字符串的长度。
        vsprintf是sprintf的一个变形,它有三个参数。vsprintf用于执行有多个参数的自订函式,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符缓冲区和一个格式字符串。第三个参数是指向格式化参数数组的指针。实际上,该指针指向在堆栈中供函数呼叫的变量。(学自《programming windows》by Charles Petzold)
      

  7.   

    前面有下划线是为了便于处理unicode字符串和ASCII字符串!
    主要是为了写出既能按ASCII编译又能按Unicode编译的单一原始码档案。
    一种解决方法就是:使用Microsoft Visual C++包含的TCHAR.H表头档案。
    Microsoft Visual C++包含的TCHAR.H表头档案不是ANSI C标准的一部分,
    因此那里定义的每个函式和宏定义的前面都有一条底线。