c语言 库打印函数

c语言 库打印函数
最新回答
落花缤纷下

2022-05-23 08:31:00

C语言标准库提供了多种打印函数,主要用于格式化输出数据到标准输出、文件流或字符串缓冲区。以下是这些函数的详细说明和示例:

1. 常用打印函数(1) printf
  • 功能:将格式化数据输出到标准输出(stdout)。
  • 原型:int printf(const char *format, ...);
  • 示例:printf("Value: %dn", 42); // 输出整数
(2) fprintf
  • 功能:将格式化数据输出到指定的文件流(如 FILE*)。
  • 原型:int fprintf(FILE *stream, const char *format, ...);
  • 示例:FILE *file = fopen("output.txt", "w");fprintf(file, "Value: %fn", 3.14); // 输出到文件fclose(file);
(3) sprintf
  • 功能:将格式化数据写入字符串缓冲区(需确保缓冲区足够大,否则可能溢出)。
  • 原型:int sprintf(char *dest, const char *format, ...);
  • 示例:char buffer[100];sprintf(buffer, "Name: %s, Age: %d", "Alice", 25); // 写入字符串
(4) snprintf
  • 功能:安全版本的 sprintf,限制写入的最大字符数(包括终止符 0)。
  • 原型:int snprintf(char *dest, size_t bufsz, const char *format, ...);
  • 示例:char buffer[10];snprintf(buffer, sizeof(buffer), "%s", "Hello"); // 最多写入9字符(+1为终止符)
2. 变参版本函数(1) vprintf, vfprintf, vsprintf, vsnprintf
  • 功能:与对应函数功能相同,但参数通过 va_list 传递,适用于封装可变参数函数。
  • 原型:int vprintf(const char *format, va_list ap);int vfprintf(FILE *stream, const char *format, va_list ap);int vsprintf(char *dest, const char *format, va_list ap);int vsnprintf(char *dest, size_t bufsz, const char *format, va_list ap);
  • 示例:#include <stdarg.h>void log_message(const char *format, ...) { va_list args; va_start(args, format); vprintf(format, args); // 输出到标准输出 va_end(args);}log_message("Error: %s (Code: %d)n", "File not found", 404);
3. 格式化字符串详解

格式化字符串(format)控制输出的样式,常见占位符:

  • 整数:%d(十进制)、%x(十六进制)、%o(八进制)。
  • 浮点数:%f、%e(科学计数法)。
  • 字符串:%s。
  • 指针:%p。
  • 宽度与精度

    %10s:右对齐,宽度10。

    %-10s:左对齐。

    %.5s:最多输出5字符。

    %*.*f:动态指定宽度和精度(如 printf("%*.*f", 10, 2, 3.1415))。

4. 示例代码(1) 基本用法#include <stdio.h>int main() { printf("String: %sn", "Hello"); printf("Integer: %d, Hex: 0x%xn", 255, 255); printf("Float: %.2fn", 3.14159); return 0;}(2) 动态宽度与精度int width = 10, precision = 3;printf("Dynamic: %*.*fn", width, precision, 123.45678); // 输出: " 123.457"(3) 安全输出到缓冲区char buf[20];snprintf(buf, sizeof(buf), "Value: %d", 100); // 避免缓冲区溢出(4) 使用 vsnprintf 实现 strlenint len = vsnprintf(NULL, 0, "%s", "Hello"); // 计算字符串长度(不实际写入)printf("Length: %dn", len); // 输出: 55. 注意事项
  1. 缓冲区溢出:sprintf 不会检查目标缓冲区大小,推荐使用 snprintf。
  2. 类型匹配:占位符需与参数类型一致(如 %d 对应 int,%f 对应 double)。
  3. 返回值:函数返回成功输出的字符数(不包括终止符),出错时返回负值。
6. 高级应用(1) 自定义日志函数void debug_log(const char *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); // 输出到标准错误 va_end(args);}debug_log("Debug: %s:%dn", __FILE__, __LINE__);(2) 时间戳日志#include <time.h>void log_with_time(const char *fmt, ...) { time_t now = time(NULL); char *time_str = ctime(&now); time_str[strlen(time_str)-1] = '0'; // 去掉换行符 printf("[%s] ", time_str); va_list args; va_start(args, fmt); vprintf(fmt, args); va_end(args);}

通过合理使用这些函数,可以灵活实现控制台输出、文件记录或字符串处理。务必注意安全性和类型匹配,避免潜在错误。