sprintf和sscanf

sprintf和sscanf

函数原型:

int sprintf(char *str, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
//成功返回成功匹配的和赋值的个数,如果达到文件末尾或发生错误,返回EOF
  • str:指向字符数组的指针,该数组存储了C字符串
  • format:是一个字符串,format标签是%[flags][width][.precision][length]specifier形式

format字段

specifier举例子来说:

  • %e是使用e字符的科学计数法。
  • %E是使用E字符的科学计数法。
  • %o是有符号八进制。
  • %u是无符号十进制。
  • %x是无符号十六进制。
  • %X是无符号十六进制大写字母。
  • %p是指针地址。
  • %n是无输出。
  • %%是%字符(转义)。

flags举例子来说

  • -是在给定的字段宽度内左对齐,默认是右对齐
  • +是强制在结果之前显示加号或减号,默认只有负数有负号
  • 0是指定填充padding的数字左边放置0,而不是空格

width举例子来说

  • 某个数:比如2,表示要输出的最小数目,如果输出更短,用空格补位,如果更长不会被截断
  • *:宽度未指定。

附加参数

附加参数 表示这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。

Blog.Edver.C语言中可变参数的用法

使用中的例子

#include <stdio.h>

int main()
{
    char in[] = "hello 123 -4.50 0x3f3f3f 011";
    char out[50];
    char arg1[6];
    int arg2;
    float arg3;
    int arg4;
    int arg5;

    //%*s表示跳过了第一个参数
    sscanf(in, "%*s %d %f %x %o", &arg2, &arg3, &arg4, &arg5);

    sscanf(in, "%s %d %f %x %o", arg1, &arg2, &arg3, &arg4, &arg5);
    //%05d表示不足5位补0,%+d表示正数有+号不省略
    sprintf(out, "%s,%05d,%+f,%+d,%o\n", arg1, arg2, arg3, arg4, arg5);
    printf("%s", out);

    sprintf(out, "%p,%-5d,%f,%+x,%o\n", arg1, arg2, arg3, arg4, arg5);
    printf("%s", out);
    return 0;
}

//输出的结果
//hello,00123,-4.500000,+4144959,11
//0x7fff14a2366a,123  ,-4.500000,3f3f3f,11

庄敬日强,功不唐捐。