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

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

前言

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

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++,算法,计算机知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值