【C/C++】format 格式化方法使用技巧(代码实例,皆可运行)

news/2024/3/28 20:23:20/文章来源:https://blog.csdn.net/qq_37286579/article/details/130267517

printf

当使用__attribute__((format(printf, ...)))语法时,可以使用printf函数作为一个例子来说明它的作用。下面是一个简单的示例代码:

#include <stdio.h>void my_printf(const char *format, ...) __attribute__((format(printf, 1, 2)));void my_printf(const char *format, ...)
{va_list args;va_start(args, format);vprintf(format, args);va_end(args);
}int main()
{int num = 10;const char *str = "hello";my_printf("num = %d, str = %s\n", num, str);return 0;
}

在这个示例代码中,my_printf函数使用了__attribute__((format(printf, 1, 2)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。

main函数中,我们调用了my_printf函数,并传递了一个格式化字符串和两个参数。由于我们使用了__attribute__((format(printf, 1, 2)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(printf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

sprintf

好的,下面再举一个例子。假设我们有一个函数my_sprintf,它的作用是将格式化字符串和参数写入一个缓冲区中。我们可以使用__attribute__((format(printf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>void my_sprintf(char *buf, const char *format, ...) __attribute__((format(printf, 2, 3)));void my_sprintf(char *buf, const char *format, ...)
{va_list args;va_start(args, format);vsprintf(buf, format, args);va_end(args);
}int main()
{char buf[100];int num = 10;const char *str = "hello";my_sprintf(buf, "num = %d, str = %s\n", num, str);printf("%s", buf);return 0;
}

在这个示例代码中,my_sprintf函数使用了__attribute__((format(printf, 2, 3)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。

main函数中,我们调用了my_sprintf函数,并传递了一个缓冲区、一个格式化字符串和两个参数。由于我们使用了__attribute__((format(printf, 2, 3)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(printf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

snprintf

好的,下面再举一个例子。假设我们有一个函数my_snprintf,它的作用是将格式化字符串和参数写入一个缓冲区中,并限制写入的字符数。我们可以使用__attribute__((format(printf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>void my_snprintf(char *buf, size_t size, const char *format, ...) __attribute__((format(printf, 3, 4)));void my_snprintf(char *buf, size_t size, const char *format, ...)
{va_list args;va_start(args, format);vsnprintf(buf, size, format, args);va_end(args);
}int main()
{char buf[100];int num = 10;const char *str = "hello";my_snprintf(buf, sizeof(buf), "num = %d, str = %s\n", num, str);printf("%s", buf);return 0;
}

在这个示例代码中,my_snprintf函数使用了__attribute__((format(printf, 3, 4)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。

main函数中,我们调用了my_snprintf函数,并传递了一个缓冲区、缓冲区大小、一个格式化字符串和两个参数。由于我们使用了__attribute__((format(printf, 3, 4)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(printf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

fprintf

好的,下面再举一个例子。假设我们有一个函数my_fprintf,它的作用是将格式化字符串和参数写入一个文件中。我们可以使用__attribute__((format(printf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>void my_fprintf(FILE *fp, const char *format, ...) __attribute__((format(printf, 2, 3)));void my_fprintf(FILE *fp, const char *format, ...)
{va_list args;va_start(args, format);vfprintf(fp, format, args);va_end(args);
}int main()
{int num = 10;const char *str = "hello";FILE *fp = fopen("output.txt", "w");my_fprintf(fp, "num = %d, str = %s\n", num, str);fclose(fp);return 0;
}

在这个示例代码中,my_fprintf函数使用了__attribute__((format(printf, 2, 3)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。

main函数中,我们调用了my_fprintf函数,并传递了一个文件指针、一个格式化字符串和两个参数。由于我们使用了__attribute__((format(printf, 2, 3)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(printf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

vprintf

好的,下面再举一个例子。假设我们有一个函数my_vprintf,它的作用是将格式化字符串和参数写入标准输出中。我们可以使用__attribute__((format(printf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>void my_vprintf(const char *format, va_list args) __attribute__((format(printf, 1, 0)));void my_vprintf(const char *format, va_list args)
{vprintf(format, args);
}void my_printf(const char *format, ...) 
{va_list args;va_start(args, format);my_vprintf(format, args);va_end(args);
}int main()
{int num = 10;const char *str = "hello";my_printf("num = %d, str = %s\n", num, str);return 0;
}

在这个示例代码中,我们定义了两个函数my_vprintfmy_printfmy_vprintf函数使用了__attribute__((format(printf, 1, 0)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。my_printf函数则是一个包装函数,它调用了my_vprintf函数,并使用可变参数列表来传递参数。

main函数中,我们调用了my_printf函数,并传递了一个格式化字符串和两个参数。由于我们使用了__attribute__((format(printf, 1, 0)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(printf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

fopen

好的,下面再举一个例子。假设我们有一个函数my_fopen,它的作用是打开一个文件,并返回一个文件指针。我们可以使用__attribute__((format(printf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>FILE *my_fopen(const char *format, ...) __attribute__((format(printf, 1, 2)));FILE *my_fopen(const char *format, ...)
{char filename[100];va_list args;va_start(args, format);vsnprintf(filename, sizeof(filename), format, args);va_end(args);return fopen(filename, "w");
}int main()
{int num = 10;const char *str = "hello";FILE *fp = my_fopen("output_%d_%s.txt", num, str);fprintf(fp, "This is a test\n");fclose(fp);return 0;
}

在这个示例代码中,my_fopen函数使用了__attribute__((format(printf, 1, 2)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。在函数内部,我们使用vsnprintf函数来将格式化字符串和参数转换成一个文件名,并使用fopen函数打开这个文件。

main函数中,我们调用了my_fopen函数,并传递了一个格式化字符串和两个参数。由于我们使用了__attribute__((format(printf, 1, 2)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(printf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

sscanf

好的,下面再举一个例子。假设我们有一个函数my_sscanf,它的作用是从一个字符串中读取格式化数据。我们可以使用__attribute__((format(scanf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>int my_sscanf(const char *str, const char *format, ...) __attribute__((format(scanf, 2, 3)));int my_sscanf(const char *str, const char *format, ...)
{va_list args;va_start(args, format);int ret = vsscanf(str, format, args);va_end(args);return ret;
}int main()
{int num;char str[100];const char *input = "10 hello";int ret = my_sscanf(input, "%d %s", &num, str);printf("ret = %d, num = %d, str = %s\n", ret, num, str);return 0;
}

在这个示例代码中,my_sscanf函数使用了__attribute__((format(scanf, 2, 3)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。在函数内部,我们使用vsscanf函数来从字符串中读取格式化数据。

main函数中,我们调用了my_sscanf函数,并传递了一个字符串和一个格式化字符串。由于我们使用了__attribute__((format(scanf, 2, 3)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(scanf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

fscanf

好的,下面再举一个例子。假设我们有一个函数my_fscanf,它的作用是从一个文件中读取格式化数据。我们可以使用__attribute__((format(scanf, ...)))语法来指定函数参数的格式,从而帮助编译器检查函数调用时传递的参数是否符合格式化字符串的要求。下面是一个示例代码:

#include <stdio.h>
#include <stdarg.h>int my_fscanf(FILE *fp, const char *format, ...) __attribute__((format(scanf, 2, 3)));int my_fscanf(FILE *fp, const char *format, ...)
{va_list args;va_start(args, format);int ret = vfscanf(fp, format, args);va_end(args);return ret;
}int main()
{int num;char str[100];FILE *fp = fopen("input.txt", "r");int ret = my_fscanf(fp, "%d %s", &num, str);printf("ret = %d, num = %d, str = %s\n", ret, num, str);fclose(fp);return 0;
}

在这个示例代码中,my_fscanf函数使用了__attribute__((format(scanf, 2, 3)))语法来指定函数参数的格式。这样,编译器就可以检查函数调用时传递的参数是否符合格式化字符串的要求。在函数内部,我们使用vfscanf函数来从文件中读取格式化数据。

main函数中,我们调用了my_fscanf函数,并传递了一个文件指针和一个格式化字符串。由于我们使用了__attribute__((format(scanf, 2, 3)))语法,编译器会检查这个函数调用是否符合格式化字符串的要求。如果我们在格式化字符串中使用了错误的格式化符号,例如%f,编译器就会给出一个警告或错误。

需要注意的是,__attribute__((format(scanf, ...)))语法只在GCC编译器中有效,其他编译器可能不支持这个语法。因此,在编写跨平台代码时,需要谨慎使用这个语法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_102548.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】popen pclose接口介绍

本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用 函数定义如下 #include <stdio.h>FILE *popen(const char *command, const char *type); int pclose(FILE *stream);1.1 popen popen函数会创建一个管道&#xff0c;fork后调用shell来打开进程。由于管道的…

射频封装技术:层压基板和无源器件集成

射频和无线产品领域可以使用非常广泛的封装载体技术&#xff0c;它们包括引线框架、层压基板、低温共烧陶瓷&#xff08;LTCC&#xff09;和硅底板载体&#xff08;Si Backplane&#xff09;。由于不断增加的功能对集成度有了更高要求&#xff0c;市场对系统级封装方法&#xf…

Qt 项目Mingw编译器转换为VS编译器时的错误及解决办法

错误 在mingw生成的项目&#xff0c;转换为VS编译器时通常会报些以下错误&#xff08;C4819警告&#xff0c;C2001错误&#xff0c;C2143错误&#xff09; 原因及解决方式 这一般是由于字符编码引起的&#xff0c;在源代码文件中包含了中文字符导致的。Qt Creator 生成的代码文…

iptables防火墙和Firewalld

引言 在 Internet 中&#xff0c;企业通过各种应用系统来为用户提供各种服务&#xff0c;如 Web 网站、电子邮件系统、FTP 服务器、数据库系统等&#xff0c;那么&#xff0c;如何来保护这些服务器&#xff0c;过滤企业不需要的访问甚至是恶意的入侵呢&#xff0c;接下来&#…

【Linux】生产者消费者模型——环形队列RingQueue(信号量)

文章目录 铺垫信号量信号量概念信号量PV操作信号量基本接口 环形队列的生产消费模型引入环形队列访问环形队列代码实现代码改造多生产者多消费者代码 总结 铺垫 之前写的代码是存在不足的地方的&#xff1a; 我们使用线程操作临界资源的时候要先去判断临界资源是否满足条件&am…

最新动态 | 大势智慧参加广东省应急测绘保障与安全生产演练

4月20日&#xff0c;2023年度广东省应急测绘保障与安全生产演练在台山市赤溪镇鱼塘湾举行。本次演练由广东自然资源厅主办&#xff0c;广东省国土资源测绘院、江门市自然资源局和台山市人民政府承办。在省市各指导单位与参演单位的多方协同与指挥下&#xff0c;应急测绘保障与安…

【三十天精通Vue 3】第十四天 Vue 3 的单元测试详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、为什么要进行单元测试1.1 单元测试的概念1.2 单元测试的优…

ctfshow_WEB_web2 wp

前言 写这个是因为。。。我想摆烂&#xff0c;就去从最简单的题开始做了&#xff0c;想着交一道题是一道嘛&#xff0c;总之觉得这样做很适合欺骗安慰自己&#xff08;逃 然后我发现我错了&#xff0c;我第二道题就做了好久还没做出来&#xff0c;甚至最后去点开了hint…… ps…

Java网络编程系列之NIO

Java网络编程系列之NIO 1.Java NIO概述1.1 阻塞IO1.2 非阻塞IO1.3 NIO概述1.3.1 Channels1.3.2 Buffer1.3.3 Selector 2.Java NIO(Channel)2.1Channel概述2.2 Channel实现2.3 FileChannel 介绍与示例2.4 FileChannel 操作详解2.4.1 打开FileChannel2.4.2 从FileChannel读取数据…

自定义测试平台搭建

体验地址&#xff1a;TestManagePlatform 首次加载会比较慢... 功能点 1.数据工具生成&#xff0c;增删改查 2.测试用例以及测试套件生成&#xff0c;测试执行测试基础用例增删改查。 3.Jacoco 代码增量扫描 4.文章管理 欢迎私聊&#xff0c;支撑自定义开发。

Java基础(十)字符串相关类

1 字符串相关类之不可变字符序列&#xff1a;String 1.1 String的特性 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如"hello" &#xff09;都可以看作是实现此类的实例。 字符串是常量&#xff0c;用双引号引起来表示。它们的值在创…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

Allegro PCB后处理

Allegro PCB后处理&#xff0c;主要是完成线路设计以后&#xff0c;输出生产文件之前的处理。这是看教程做的记录&#xff0c;方便以后自己参考。 教程&#xff1a; [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xff0…

Simulation Extractable Versions of Groth’s zk-SNARK Revisited学习笔记

1. 引言 等人2020年论文《Simulation Extractable Versions of Groth’s zk-SNARK Revisited》&#xff0c;开源代码实现见&#xff1a; https://github.com/Baghery/ABPR22&#xff08;Rust&#xff0c;基于arkworks开发。使用了Multi-Scalar Multiplication (MSM)技术来优化…

linux下使用ftp下载服务器数据

首先确认服务器地址 比如我要从uniprot获取数据&#xff0c;需要先ping服务器地址&#xff1a; 可见&#xff0c;ftp地址不需要前面的https 匿名登录 匿名&#xff1a;anonymous 密码&#xff1a;任意邮箱&#xff0c;如123163.com 这里的传输模式我使用的是二进制&#xff…

Revit进入Unity教程

一、背景 小伙伴们是否有Revit进入Unity交互的需求呢&#xff1f; 二、实现功能 1.Revit进入Unity,包含模型属性&#xff0c;材质&#xff0c;轻量化等 2.实现BIM构件点选&#xff0c;高亮&#xff0c;属性展示 3.实现BIM模型分层显示&#xff0c;爆炸等效果 学习教程&…

xilinx zynq+vitis实现命令行编译输出xsa以及bin文件

执行菜单命令【开始】—【所有程序】—【Xilinx Design Tools】—【Vivado2020.1】—【Vivado2020.1Tcl Shell】,弹出命令界面 或者cmd命令下输入call D:\soft_install\vivado2020.1\Vivado\2020.1\bin\vivado.bat -mode tcl 2.输入打开工程指令&#xff1a; open_project …

SpringBoot整合Redis,一篇带你入门使用Redis

本文介绍如何将Redis整合到SpringBoot项目中&#xff0c;以及如何配置、封装和使用 文章目录 前言环境搭建项目结构添加依赖 Module封装RedisConfig配置封装常见操作为ServiceRedisServiceRedisLockUtil 测试 前言 参考链接&#xff1a; 英文官网链接中文官网链接Redis githu…

【Matlab】基于紧格式动态线性化的无模型自适应控制

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 对应书本 4.2 单输入单输出系统(SISO)紧格式动态线性化(CFDL)的无模型自适应控制(MFAC) 例题4.1 题目要求 matlab代码 clc; clear all;%% 期望轨迹…

mybatis-plus的代码生成器的应用

目录 1.工程引入mybatis-plus3-generator代码生成器2.只需要关注mybatis-plus-config.properties然后生成代码3.分别添加依赖解决报错4.加入其它配置然后测试效果 3.4版本 1.工程引入mybatis-plus3-generator代码生成器 mybatis-plus3-generator放入项目工程中&#xff0c;父工…