(C语言) print输出函数系列介绍

(C语言) print输出函数系列介绍

文章目录

  • (C语言) print输出函数系列介绍
  • 前言
  • 输出系列函数
    • 🖨️printf
    • 🖨️sprintf & snprintf
    • 🖨️fprintf
    • 🖨️vprintf
    • 🖨️dprintf
    • 🖨️puts
    • 🖨️fputs
    • 🖨️putchar
    • 🖨️putc & fputc
  • END

前言

起因是因为这么一段祝福语:

Linux 和 libc 给您

拜 年 啦

在这辞旧迎新的美好时刻:

🧨 printf 携手 fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf, fputc, fputs, putc, putchar, puts 祝您新的一年能大展宏图
🧨 scanf 携 sscanf, vsscanf, fscanf, vscanf, vfscanf, fgetc, fgets, getc, getchar 祝您财源广进,金银满仓,钱途无量
🧨 exit, _exit, _Exit, atexit, on_exit, quick_exit, at_quick_exit 希望您在这一年终末,能够善始善终,圆满收官
🧨 execl, execlp, execle, execv, execvp, execvpe 愿您新的一年开启新篇章,事业生活蒸蒸日上
🧨 fork, vfork, clone, __clone2, clone3 祝您家庭美满,阖家欢乐
🧨 wait, waitpid, waitid, wait3, wait4 希望各位都能遇得良机和贵人,新的一年一帆风顺
🧨 signal, sigaction, sigvec, sigblock, sigsetmask, siggetmask, sigmask, setjmp, sigsetjmp, longjmp, siglongjmp 愿您新的一年能逢凶化吉,巧解难题
最后,alarm, sleep, usleep, nanosleep, clock_nanosleep, pause 愿您新的一年能安枕无忧,好睡眠,身体康健

祝大家新年快乐,万事如意!

输出系列函数

🖨️printf

//   (C99 前) 
int printf( const char *format, ... );
//   (C99 起) 
int printf( const char *restrict format, ... );

从给定位置加载数据,转换为字符串等价物,并写结果到各种池。

写结果到 stdout 。

#include <stdio.h>

int main() {
    int ret = printf("Hello World\n");
    printf("ret = %d\n", ret);
}
Hello World
ret = 12

🖨️sprintf & snprintf

✍️sprintf

//   (C99 前)
int sprintf( char *buffer, const char *format, ... ); 
//   (C99 起) 
int sprintf( char *restrict buffer, const char *restrict format, ... );

从给定位置加载数据,转换为字符串等价物,并写结果到各种池。

写结果到字符串 buffer

将字符输出到第一个char*的参数中。

结尾会补\0

#include <stdio.h>

int main() {
    char str[1024] = "0123456789";
    // 尾部会补'\0'
    int ret = sprintf(str, "Hello World");
    printf("%s\n", str);

    return 0;
}
Hello World

snprintf

// (C99 起) 
int snprintf( char *restrict buffer, int bufsz, const char *restrict format, ... );
// (C11 起) 
int snprintf_s(char *restrict buffer, rsize_t bufsz, const char *restrict format, ...);

从给定位置加载数据,转换为字符串等价物,并写结果到各种池。

写结果到字符串 buffer 。至多写 buf_size - 1 个字符。产生的字符串会以空字符终止,除非 buf_size 为零。若 buf_size 为零,则不写入任何内容,且 buffer 可以是空指针,然而依旧计算返回值(会写入的字符数,不包含空终止符)并返回。

同样是输出到指定的char*中,但是有第二个参数来指定输出长度。

结尾不会补\0

#include <stdio.h>
#include <string.h>

int main() {
    char str[1024] = "0123456789";
    int  len       = 5;

    // 尾部不加'\0'
    snprintf(str, 5, "Hello World\n");
    printf("strlen()=%d str=%s\n", strlen(str), str);

    str[len] = '\0';
    printf("strlen()=%d str=%s\n", strlen(str), str);
}
strlen()=10 str=Hello56789
strlen()=5 str=Hello

🖨️fprintf

//  (C99 前) 
int fprintf( FILE *stream, const char *format, ... );
//  (C99 起) 
int fprintf( FILE *restrict stream, const char *restrict format, ... );

从给定位置加载数据,转换为字符串等价物,并写结果到各种池。

写结果到文件流 stream

输出到指定的文件中FILE*

#include <stdio.h>

int main() {
    FILE* pfile = fopen("out.txt", "w+");
    if (pfile) {
        fprintf(pfile, "Hello World");
        fclose(pfile);
    }
}
# 生成一个名为“out.txt”的函数
# 并在文件中写入:Hello World

🖨️vprintf

//  (C99 前) 
int vprintf( const char *format, va_list vlist );
//  (C99 起)
int vprintf( const char *restrict format, va_list vlist );

vlist 所定义的位置加载数据,将它们转换成字符串等价物,并将结果写入各种池。

写结果到 stdout。

变参输出,用于C语言式的变参函数的输出。

注意一下C语言中变参函数的使用方式。

#include <stdarg.h>
#include <stdio.h>

/**
 * C语言的变参函数
 * - va_start
 * - va_end
 */
void test_variable(const char *format, ...) {
    va_list args;
    va_start(args, format);
    // 打印变参内容
    vprintf(format, args);
    va_end(args);
}

int main() {
    test_variable("Func[%s] Line[%d]\n", __func__, __LINE__);
}
Func[main] Line[18]

🖨️dprintf

int dprintf(int fd, const char *format, ...);
       dprintf(), vdprintf():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before glibc 2.10:
               _GNU_SOURCE
               
       The function dprintf() is the same as fprintf() except that it outputs to a file descriptor, fd, instead of to
       a stdio stream.

这是一个非跨平台函数,输出到指定的fd当中。

注意:经测试linux中可行,windows中不行。

/**
 * linux code
 */
#include <stdio.h>
#include <unistd.h>

int main() {
    // int dprintf(int fd, const char *format, ...);
    dprintf(STDOUT_FILENO, "Hello World\n");

    return 0;
}
Hello World

🖨️puts

int puts( const char *str );

写入每个来自空终止字符串 str 的字符及附加换行符 ‘\n’ 到输出流 stdout ,如同以重复执行 putc 写入。

不写入来自 str 的空终止字符

#include <stdio.h>

int main(void) {
    // 输出到 stdpout
    int ret = puts("Hello World\n");
    printf("%d\n", ret);
}
Hello World

0

🖨️fputs

//  (C99 前) 
int fputs( const char *str, FILE *stream );
//  (C99 起) 
int fputs( const char *restrict str, FILE *restrict stream ); 

写入字符 ch 到给定输出流 stream 。 putc() 可以实现为宏并对 stream 求值超过一次,故对应的参数决不应是有副效应的表达式。

在内部,在写入前将字符转换为 unsigned char 。

#include <errno.h>
#include <stdio.h>

int main(void) {
    // 传入空指针,保证出现错误
    int ret = fputs("Hello World", NULL);

    if (ret == EOF) {
        perror("fputs() errno");
    }
}
fputs() errno: Invalid argument

🖨️putchar

int putchar( int ch );

写字符 chstdout 。在内部,字符于写入前被转换到 unsigned char 。

等价于 putc(ch, stdout)

#include <stdio.h>

int main(void) {
    for (char c = 'a'; c != 'z'; c += 1) {
        int ret = putchar(c);

        if (ret == EOF) {
            if (ferror(stdout)) {
                perror("putchar() failed\n");
                break;
            }
        }
    }  // for
}
abcdefghijklmnopqrstuvwxy

🖨️putc & fputc

int fputc( int ch, FILE *stream );
int putc( int ch, FILE *stream ); 

输出单个字符到第二个参数设定的流中。

#include <stdio.h>

int main(void) {
    for (char c = 'a'; c != 'z'; c += 1) {
        int ret;
        if (c & 1) {
            ret = putc(c, stdout);
        } else {
            ret = fputc(c, stdout);
        }
        
        if (ret == EOF) {
            if (ferror(stdout)) {
                perror("putc() failed\n");
                break;
            }
        }
    }  // for
}
abcdefghijklmnopqrstuvwxy

END

关注我,学习更多C/C++,算法,计算机知识

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

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

相关文章

Java开发---上海得帆(一面)

面试感受 这是我的第一次面试&#xff0c;我感觉我这次面试的很差&#xff0c;很糟糕&#xff0c;十分的糟糕&#xff0c;万分的糟糕。第一次面试&#xff0c;面试了半个小时。我去真的好紧张&#xff0c;脑子里一篇空白。脑子空白还不是最惨的&#xff0c;最惨的是那个八股文…

【C语言进阶篇】自定义类型:联合体和枚举

【C语言进阶篇】自定义结构体类型&#xff1a;联合体和枚举 &#x1f308;个人主页&#xff1a;开敲 &#x1f525;所属专栏&#xff1a;C语言 &#x1f33c;文章目录&#x1f33c; 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 联合体大小的计算 2. 枚举 2.1 枚举…

动态内存经典笔试题分析及柔性数组

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

链式二叉树

前言 本章将重点讲解链式二叉树的四种遍历方式。 一、链式二叉树 1、引入链式二叉树 我们知道完全二叉树可以使用堆存储&#xff0c;那非完全二叉树&#xff1f; 非完全二叉树不适合用堆来存储&#xff0c;因为浪费空间&#xff0c;所以非完全二叉树使用链式存储。 2、链式二…

做独立站烧不烧钱?真做起来的话要投入多少成本?

建立一个独立网站需要花钱吗&#xff1f; 实际做起来要花多少钱&#xff1f; 这是一种灵魂的拷问&#xff0c;也是大多数想进入这个行业或者刚刚起步的人都在思考或者思考的问题。 对于这样的问题&#xff0c;没有人能够给出确切的数字&#xff0c;甚至是确定的答案。 至于为什…

python基础——对序列的通用操作【+和*、in、切片操作、separator.join(iterable)】

&#x1f4dd;前言&#xff1a; 我们已经学习了python数据容器中的列表&#xff0c;元组以及字符串。而他们都属于序列 &#xff08;序列是指&#xff1a;内容连续&#xff0c;有序&#xff0c;可以用下标索引访问的数据容器&#xff09; 在之前已经介绍了不少操作方法&#xf…

NVIDIA 推出地球-2云平台,使用AI超级计算机的模拟技术,预测整个地球的气候变化

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Sui技术帮助Studio Mirai成功实现创意愿景

Brian和Ben Li兄弟对艺术充满热情&#xff0c;通过共同创立的研发工作室Studio Mirai&#xff0c;他们正在探索Web3技术与创意产业的交集。 Studio Mirai的第一个头像类项目&#xff08;profile picture&#xff0c;PFP&#xff09;Tamashi存在于Nozomi World中&#xff0c;这…

教育内卷化:焦虑下的竞争与反思

教育内卷化&#xff1a;焦虑下的竞争与反思 一、教育内卷化的现象解读 教育内卷化&#xff0c;作为当前社会的热点话题&#xff0c;体现了教育资源竞争日趋激烈的现状。这一现象在中小学阶段尤为明显&#xff0c;家长们为了让孩子进入优质学校&#xff0c;不惜花费巨资购买学…

【SpringCloud】Consul中数据持久化配置并注册为Windows服务

Consul用起来两个比较麻烦的地方: 一是每次都需要执行打开命令行执行 consul agent -dev 命令来启动Consul服务,而且不能关掉命令行.另外一点就是在Consul中设置的数据,每次重启之后就没了. 就很烦.因此为大家带来解决上述问题的方法 首先要在官网下载Consul安装包的解压目录下…

ArcGIS添加天地图底图服务

目录 一、注册天地图官网、申请Key 二、ArcGis配置和使用 1、配置 2、使用 三、其他方法 一、注册天地图官网、申请Key 进入官网&#xff0c;并注册账号。 地址&#xff1a;国家地理信息公共服务平台 天地图 (tianditu.gov.cn) 点击地图API&#xff0c;申请Key。 注意&am…

使用有道bce-embedding-vase-v1模型构建知识向量库并进行相似度搜索

国产embedding 最开始使用LangChain结合通义千问API实现了基础的RAG&#xff08;Retrieval-Augmented Generation&#xff09;过程&#xff0c;当时认为embedding模型似乎是LangChain的一部分&#xff0c;然后又通过学习OpenAI的API发现&#xff0c;其实使用embedding模型不需要…

可视化日记——极坐标绘制雷达图

目录 一、创建极坐标 二、数据集准备 三、划分角度 四、指定半径 五、绘制 一、创建极坐标 Python中没有直接画雷达图的函数&#xff0c;若要绘制需要先创建画布和极坐标轴域&#xff0c;再设定角度与半径的参数&#xff08;极坐标中角度与半径确定一个点的位置&#xff…

反射机制的知识

1.反射机制 静态语言&#xff1a;JAVA 和C 反射&#xff1a;可以借助于反射API可以获取任何类的内部信息&#xff0c;并可以直接操作任意对象的内部属性、方法、泛型等。 实现获得Class类的方法有哪些&#xff1a; 类名.classClass.forName("类的绝对路径")对象.ge…

Python爬虫基础教程:爬虫采集数据要注意什么?|电商数据商品详情页API接口

数字化时代&#xff0c;大数据信息的收集和应用逐步普及&#xff0c;离不开网络爬虫的广泛应用。由于数据和信息市场的不断扩大&#xff0c;需要大规模的网络爬虫来应对大规模的数据信息采集。在此过程中需要注意哪些问题&#xff1f; 1、先检查是否有API&#xff0c;API是网站…

Women of Polkadot:波卡生态的女性社群与创新力量

在 Web3 行业里&#xff0c;女性似乎总是被忽视的群体。线下峰会的合照一眼望去尽是西装革履的男性成员&#xff0c;项目和机构高管的名单里也似乎难以寻觅到女性领导者的身影。在这个强调技术、编程、极客精神的行业里&#xff0c;女性身份的缺席看起来如此天生自然。 根据 B…

人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象

大家好&#xff0c;我是微学AI&#xff0c;今天给大介绍一下人工智能基础部分25-一篇文章将透注意力机制(Attention)与自注意力机制(self-Attention),帮助大家加深印象。注意力机制(Attention)与自注意力机制(self-Attention)都是在深度学习模型中用于提升模型性能的技术&#…

C 多维数组

C 语言支持多维数组。多维数组声明的一般形式如下&#xff1a; type name[size1][size2]...[sizeN];例如&#xff0c;下面的声明创建了一个三维 5 . 10 . 4 整型数组&#xff1a; int threedim[5][10][4];二维数组 多维数组最简单的形式是二维数组。一个二维数组&#xff0c…

测试开发面试题总结(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 某基金管理公司线下测试开发面试题总结。 测开题目如下 可以尝试自己先写&#xff0c;写完之后…

【Linux】实现进度条小程序

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. 回车和换行3. 缓冲区4. 进度条4.1 倒计时设置4.2 进度条4.2.1 实现简单进度条4.2.2 进度条完善 5. 附进度条代码5.1 Processbar.h5.2 Processbar.c5.3 Main.c5.4 Makefile 1. 前言 在之前已经了解了 【Lin…