为什么需要转换字符?

时间:2019-09-01 20:23:12

标签: c printf

运行此命令时:

#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等)?

2 个答案:

答案 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编写的,因此只能使用该语言提供的那些函数。