curl

Posted by
  • 可以简单理解为命令行版的Postman
  • Linux和Windows上都有
  • Windows版下载
    • 解压后,把目录放到path环境变量中,就可以在cmd中使用curl命令了
  • 使用
    • 可以通过参数指定HTTP头部、请求参数等
#include <stdio.h>  #include <stdarg.h>    int mySprintf( char *szBuffer, const char *szFormat, ... )  {      int iLength ;             //存储字符串的长度信息      va_list pArgs ;              //声明一个va_list型变量        va_start( pArgs, szFormat ) ;  //让pArgs指向变参      iLength = vsprintf( szBuffer, szFormat, pArgs ) ;  //输出到缓冲区szBuffer中      va_end(pArgs);              //释放pArgs        return iLength ;             //返回字符串长度  }    int main()  {      int i;      char szBuffer[128] ;        i = mySprintf( szBuffer, "today: %d-%d-%d", 2012, 10, 8 ) ;      puts( szBuffer ) ;        return 0 ;  }            

再来看看va_start宏:

 

sprintf有个变形函数, 叫vsprintf, 首先看下这个函数的原型:

va_end的作用是销毁释放一个va_list型的参数列表, 例如:

 

==============

int vsprintf(char *szBuffer, const char *format, va_list param);

 

一、可变参函数

 

图片 1

 

  当格式化后的字符串长度 < size,则将此字符串全部复制到szBuffer中,并给其后添加一个字符串结束符(‘’);当格式化后的字符串长度 => size,则仅复制( size – 1 )个字符到缓冲区szBuffer内, 并在其后添加一个字符串结束符(‘’) 。

 

va_list宏的用法:

二、实现Windows版的printf

 

 

#include <stdio.h>    int main()  {      char szBuffer[50] ;   //定义缓冲区大小为50字节      sprintf( szBuffer, "today: %d-%d-%d", 2012, 10, 8 ) ;   //将今天的日期格式化输出到缓冲区      puts( szBuffer ) ;   //输出缓冲区szBuffer中的字符        return 0 ;  }

vsprintf的前两个参数与sprintf相同, 第三个参数为一个va_list宏, va_list宏就是解决C语言变参问题的。

在些宏在STDARG.H头文件中有定义, 打开STDARG.H可以看到, 其中有句:

 

 format为函数的参数, 可以用来指明参数的类型

_snprintf相对于sprintf函数多出了个参数, size_t size, 这个参数的功能是:

  当我们使用sprintf时, 我们需要首先定义一个缓冲区, 这个缓冲区我们必须定义的足够大以至于能容纳我们格式化输出的字符串, 如果超过了这个长度, 程序将会出错, 这样是不安全的, 这里, 使用_snprintf()函数来解决这个问题, _snprintf的原型为:

 

 

#include <stdio.h>  #include <windows.h>    int CDECL myMessageBox( TCHAR * szCaption, size_t iStyle, TCHAR * szFormat, ... )    {  //myMessageBox函数参数: 标题, 样式, 格式化输出内容
  //CDECL为调用规则, 在WINDEF.H定义为: #define CDECL _cdecl
       TCHAR   szBuffer [1024] ;        va_list pArgs ;         va_start (pArgs, szFormat) ;       _vsnprintf( szBuffer, sizeof(szBuffer) / sizeof (TCHAR), szFormat, pArgs ) ;     //sizeof(szBuffer) / sizeof (TCHAR)得到最大能容下的字符个数       va_end (pArgs) ;
       return MessageBox(NULL, szBuffer, szCaption, iStyle) ;    }    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,                      PSTR szCmdLine, int iCmdShow)   {       int cxScreen, cyScreen ;
       cxScreen = GetSystemMetrics (SM_CXSCREEN) ; //获取显示器x方向像素       cyScreen = GetSystemMetrics (SM_CYSCREEN) ; //获取显示器y方向像素         myMessageBox( TEXT ("显示器分辨率"), MB_OKCANCEL, TEXT ("显示器当前分辨率为:%dx%d。"), TEXT(cxScreen), TEXT(cyScreen) ) ;         return 0 ;    }

在Windows中使用printf

va_list ap  va_end( ap );

从这句我们可以看出, va_list其实就是char*型类型, 一个字符型指针;

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注