以下给出的代码是错误的吗?
#include int main() { int a; printf(scanf("%d",&a)); return 0; }
我收到此消息“Segmentation fault(core dumped)”
printf()
函数的格式为: –
printf(const char *format, ...)
您必须提供一个字符串 ( 格式说明符的格式字符串 )作为函数printf()
参数。
你可以试试: –
printf("%d",scanf("%d",&a)); // with format string
如果扫描成功,将打印1 。 这里%d
是integer
参数的格式字符串 。
要读取和打印变量a
,请尝试: –
scanf("%d",&a); // reading printf("%d",a); // printing
阅读编译器警告。
prog.c:8:12: warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion] printf(scanf("%d",&a)); ^~~~~
printf
想要一个字符串作为第一个参数。 你给它一个整数。
你想打印’a’,所以你应该这样做
scanf("%d",&a); printf("%d", a);
scanf()
返回写入链接的字符总数
scanf
查看你的格式字符串,看到%d
并将它与你提供的&a
的地址匹配。 如果在尝试读取值时出现错误, scanf
将返回EOF
,否则它将返回成功匹配为int
的项目数。 例如,如果键入123
,则scanf("%d", &a) == 1
为true,但如果键入q123
,则scanf("%d", &a) == 0
为true。
printf
需要一个格式字符串,就像scanf
一样,它使用该格式来打印参数的值。 它无法知道scanf
使用的格式是否也是您想要用于打印的格式,并且您没有提供字符串,这是一种指针,包含打印参数的格式。 这是您的代码的问题。
整数(例如scanf
返回的int
值)可以转换为指针,而无需告诉编译器执行转换。 因此,编译器可能会抱怨您正在做一些可能存在问题的事情( 警告:传递’printf’的参数1使得指针来自整数而不进行强制转换 ),但该代码将被允许编译和执行。
当您看到类似的警告时,请查看该参数所需的函数类型以及您用作该参数的值的类型。 很可能编译器试图帮助你避免像printf(scanf("%d", &a));
这样的错误printf(scanf("%d", &a));