直接输出 会导致编译错误或意外行为,因为编译器会认为你开始了一个格式说明符(%d, %s)。

(图片来源网络,侵删)
要解决这个问题,你需要对 进行“转义”,以下是几种正确的方法,按推荐顺序排列。
使用 (最推荐、最标准)
这是最标准、最清晰、最推荐的方法,在 printf 的格式字符串中,连续的两个百分号 会被解释为一个普通的字面百分号 被输出。
示例代码:
#include <stdio.h>
int main() {
// 输出一个简单的百分号
printf("这是一个百分号: %%\n");
// 在格式化输出中混合使用
int value = 50;
printf("进度: %d%%\n", value); // 输出: 进度: 50%
// 输出百分比符号本身
printf("%%\n");
return 0;
}
编译和运行:

(图片来源网络,侵删)
gcc -o output_percent output_percent.c ./output_percent
输出结果:
这是一个百分号: %
进度: 50%
%
为什么这是最好的方法?
- 可读性强: 的意图非常明确,就是输出一个 。
- 标准做法:这是 C 语言标准定义的转义方式,适用于所有遵循标准的 C 编译器和库。
- 无需额外变量:不需要创建一个只包含 的字符变量。
使用 fprintf 输出到文件
如果你想将输出重定向到文件,方法同样适用。fprintf 的工作方式和 printf 完全一样,只是第一个参数是文件指针。
示例代码:

(图片来源网络,侵删)
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("output.txt", "w"); // 以写入模式打开文件
if (fp == NULL) {
perror("无法打开文件");
return 1;
}
// 向文件中写入带有百分号的内容
fprintf(fp, "下载完成: 100%%\n");
fprintf(fp, "使用率: %d%%\n", 85);
fclose(fp); // 关闭文件
printf("内容已写入 output.txt\n");
return 0;
}
编译和运行:
gcc -o fprintf_example fprintf_example.c ./fprintf_example
查看文件内容:
cat output.txt
输出结果:
下载完成: 100%
使用率: 85%
使用 putchar 或 fputc
如果你不想使用 printf 的格式化功能,只是想单纯输出一个字符,可以使用 putchar(输出到标准输出)或 fputc(输出到指定文件流)。
示例代码:
#include <stdio.h>
int main() {
// 使用 putchar 输出到屏幕
putchar('%');
putchar('\n'); // 换行
// 使用 fputc 输出到文件
FILE *fp = fopen("putchar_output.txt", "w");
if (fp != NULL) {
fputc('%', fp);
fputc('\n', fp);
fclose(fp);
}
return 0;
}
编译和运行:
gcc -o putchar_example putchar_example.c ./putchar_example
屏幕输出:
(putchar_output.txt):**
何时使用此方法?
- 当你只需要输出一个固定的字符,不需要任何格式化时。
- 在性能要求极高的场景下,直接输出单个字符可能比格式化字符串有微小的性能优势(但现代编译器通常会优化这种情况)。
常见错误及原因
错误代码示例:
#include <stdio.h>
int main() {
// 错误的写法
printf("这是一个百分号: %\n"); // 编译器会发出警告
// 更危险的错误写法
int num = 100;
printf("错误示范: %d%\n", num); // 编译器可能会警告,但行为不确定
// printf 期望在 %d 之后有一个格式说明符,但遇到了 %
// 这可能导致未定义行为,比如程序崩溃或输出乱码
return 0;
}
错误原因:
printf函数通过格式字符串中的 来识别后续需要被替换的变量。- 当编译器看到 时,它会期望紧跟着一个格式字符(如
d,f,s,c等)。 - 如果只看到一个孤立的 ,编译器无法理解你的意图,因此会发出警告。
- 在第二个错误示例中,
%d正确地读取了num的值,但后面的 没有对应的变量,这会导致未定义行为。
| 方法 | 代码示例 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 转义 | printf("50%%\n"); |
标准、清晰、推荐 | 无明显缺点 | 几乎所有情况,尤其是在格式化字符串中 |
putchar |
putchar('%'); |
简单、直接 | 无法格式化 | 只需输出单个字符,无格式化需求时 |
fputc |
fputc('%', fp); |
简单、直接 | 无法格式化 | 只需向文件流输出单个字符时 |
对于在 Linux C 语言中输出 ,请务必使用 ,这是最正确、最安全、最符合规范的做法。
