当我运行这个时:
#include <stdio.h>
int main() {
int x = 1;
printf(x, "n");
return 0;
}
它给了我这些错误:
线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x1(
格式字符串不是字符串文本(可能不安全(
将字符串视为参数以避免这种情况
不兼容的整数到指针转换将"int"传递给类型为"const char *"的参数
它输出:
(分行(
但是,当我将其更改为:
printf("%s", x);
它工作得很好。(输出"1",如预期的那样(
为什么需要转换字符(例如 %s、%d 等(?
它们需要告诉printf
函数您传递的参数的类型(和数量(。
该语言没有允许函数动态确定这一点的机制,因此格式字符串为其提供了解码它们的线索。
格式字符串始终是第一个参数,因为被调用的函数始终可以在同一个位置访问该参数。像printf这样的函数通常仍然是用C编写的,所以只能使用语言提供的那些函数。
它们的参数不是"转换字符"。我认为您的困惑来自这样一个事实,即您认为printf
只是打印所有参数并自动推断如何打印每个参数。但是,printf
不能那样工作,因为 C 不支持重载。
具体来说,第一个论点与其他论点不同。它不是要打印的东西,而是一个格式字符串。通过尝试以下方法,您可以轻松了解它的含义:
printf("My friend %s has %d coins!", "John", 123);
这将打印:
My friend John has 123 coins!
%s
此处指定第一个参数(在格式字符串之后(将被解释为字符串,%d
表示第二个参数(再次,在格式字符串之后(将被理解为整数。两者都将替换为参数中的实际值。