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