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

慈云数据 1年前 (2024-03-22) 技术支持 90 0

(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 
      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 
      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 
      #include 
      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 
      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 
      #include 
      /**
       * 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 
      #include 
      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 
      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 
      #include 
      int main(void) {
          // 传入空指针,保证出现错误
          int ret = fputs("Hello World", NULL);
          if (ret == EOF) {
              perror("fputs() errno");
          }
      }
      
      fputs() errno: Invalid argument
      

      🖨️putchar

      int putchar( int ch );
      

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

      等价于 putc(ch, stdout) 。

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

微信扫一扫加客服

微信扫一扫加客服