C语言格式化输入输出流函数

文章详细介绍了C语言中的格式化输出函数sprintf、snprintf,以及它们的变体vprintf、vsprintf、vsnprintf,这些函数用于将格式化的字符串输出到指定位置。同时,文章也讲解了格式化输入函数sscanf和其变体vsscanf,用于从字符串中读取格式化数据。所有函数都涉及到va_list和可变参数列表的使用。
摘要由CSDN通过智能技术生成

sprintf 和 snprintf 函数

头文件:
#include <stdio.h>
函数原型:
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
描述:
        同 printf 的原理一样,不过 printf 是将格式化字符串 format 输入到 stdout 输出流中,而 sprintf 是将格式化字符串输入到一块字符地址中, snprintf 指明了最多能写入多少字节格式化字符串,如果 format 长度比 size 小则全部可以写入 str 中然后再补上‘\0’,如果 format 的长度比 size 大则只保存 size-1 字节个 format ,然后补一 个’/0’ ,写到 str
返回值:
        若成功则返回预写入的字符串长度,若出错则返回负值
备注:
        无

vprintf,vsprintf 和 vsnprintf 函数

头文件:
#include <stdarg.h>
函数原型:
int vprintf(const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
描述:
        vprintf 类的格式化输出函数和 printf 类的格式化输出函数只在于参数的不同,printf 类的输出函数是可变长参数的,而 vprintf 类的输出函数参数变成 va_list ,一般是配合可变长接口做使用。其他没有任何不同
使用示例:
void fun(int num,...)
{
    va_list ap;
    va_start(ap,num);
    //1
    vprintf("%d,%d,%d,%d\n",ap);
    //2
// for(int i = 0;i < num;i++)
// {
    // vprintf("%d\n",ap);
// }
    va_end(ap);
}
int main ()
{
    fun(4,100,200,300,400);
    return 0;
}

备注:
        如上图例子可知,在 vprintf 内部其实实现了 va_arg(va_list,type) 的操作,而且根据格式化输出的% 去执行不同的 va_arg 操作,例如, vaprintf ”%c,%d,%f”,ap ;其实相当于执行了:
printf(“%c”,va_arg(ap,char)); printf(“%d”,va_arg(ap,int)); printf(“%f”,va_arg(ap,float));这三条语句。

sscanf 函数

头文件:
#include <stdio.h>
函数原型:
int sscanf(const char *str, const char *format, ...);
描述:
        sscanf 函数和 scanf 类似,不过 scanf 是从 stdin 输入缓冲区中取格式化数据给对应的内存空间,而 sscanf 函数则是从 str 中获取格式化字符串输出到内存空间中。
返回值
        返回读取的数据个数
使用示例:
int main ()
{
    char str[128] = "123,a,12.5,nihao";
    int a;
    char b;
    float c;
    char buf[16] = {0};
    sscanf(str,"%d,%c,%f,%s",&a,&b,&c,buf);
    printf("a = %d,b = %c,c = %f,buf = %s\n",a,b,c,buf);
    return 0;
}

vscanf 和 vsscanf 函数  

头文件:
#include <stdarg.h>
函数原型:
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
描述:
vscanf 类的和 scanf 类的区别只在于参数的不同, scanf 类使用的是可变参数,而
vcanf 类函数使用的是 va_list 参数,通常配合在可变函数内进行使用。
使用示例:
void fun(int num,...)
{
    va_list ap;
    va_start(ap,num);
    //1
    vscanf("%d,%d,%f,%f",ap);
    //2
    // for(int i = 0;i < num;i++)
    // {
        // vscanf("%d",ap);
    // }
    va_end(ap);
}
int main ()
{
    int a;
    int b;
    float c;
    float d;
    fun(4,&a,&b,&c,&d);
    printf("%d,%d,%f,%f\n",a,b,c,d);
    return 0;
}

 备注:

        无
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值