1. 字符串处理与格式化输入输出详解
1.1 字符串输入输出函数实战
在C语言中,字符串处理是最基础也是最重要的技能之一。puts和gets这两个函数看似简单,但实际使用中有许多需要注意的细节。
puts函数的本质是将字符串写入标准输出(stdout)并自动添加换行符。它的返回值是输出的字符数(包括自动添加的换行符),如果出错则返回EOF。在实际项目中,我经常用它来输出调试信息:
c复制char debug_msg[] = "程序执行到第X阶段";
int count = puts(debug_msg); // 输出并获取字符数
gets函数由于其安全性问题,在C11标准中已被移除。我在早期项目中曾因为使用gets导致缓冲区溢出漏洞,后来彻底改用fgets。fgets的第三个参数指定输入流,通常使用stdin:
c复制char input[100];
fgets(input, sizeof(input), stdin); // 安全读取一行
重要提示:fgets会保留输入中的换行符,而gets不会。这是两者行为上的重要区别,处理字符串比较时经常因此出错。
1.2 格式化输出深度解析
printf的格式化输出远比表面看起来复杂。在实际嵌入式开发中,精确控制输出格式尤为重要。以下是一些高级用法示例:
c复制// 控制浮点数精度和对齐
double voltage = 3.3;
printf("|%10.3f|%-10.3f|%010.3f|\n", voltage, voltage, voltage);
// 输出:| 3.300|3.300 |000003.300|
// 使用*动态指定宽度和精度
int width = 8, precision = 2;
printf("%*.*f\n", width, precision, 3.14159); // 输出: 3.14
十六进制输出在调试硬件寄存器时特别有用:
c复制unsigned int reg_value = 0xABCD1234;
printf("寄存器值:0x%08X\n", reg_value); // 输出:0xABCD1234
