我们可以将格式说明符字符串的地址传递给printf

时间:2012-08-25 07:07:01

标签: c pointers char printf

我们如何编写这种类型的语法

#include<stdio.h>
main()
{
  char *str;
  str="%s";
  printf(str,"K\n");
  return 0;
}

printf语句是否有效?

4 个答案:

答案 0 :(得分:3)

是的,它是有效的,因为您的str类型为char *。这是printf的原型:

int printf ( const char * format, ... );

从被调用函数的角度来看,您的语句将与:

相同
printf("%s","K\n");

"%s""K\n"char *类型的常量表达式。

答案 1 :(得分:3)

printf()的函数调用是有效的,因为作为第一个参数,它需要一个常量字符串作为格式说明符。不要认为字符串是放在引号之间的东西 - 把它想象成一个字符数组(加上一个终止的0字符)。在C(以及任何有意义的编程语言)中,只要有一个值,它的类型和实际值/内容就决定了它的行为 - 让它成为文字,变量或任何其他表达式(我们现在不考虑const的正确性)为了简单起见)。就像在数学中一样,你是否写

并不重要
3 + 2 = 5

x = 3
y = 2
x + y = 5

这里第二个相等的第三行仍然有效,尽管x和y不是文字。它们是变量,在使用它们时会使用它们的当前值。

现在是关于其他答案缺乏的const正确性的一个小观点:字符串文字的类型为const char *而不是char *,因为您无法更改其内容。因此,编写

并不是一件好事
char *foo = "blah blah";

改为写

const char *foo = "blah blah";

答案 2 :(得分:1)

是的,语法有效。该程序的结果是字符串“K \ n”

其中\ n表示换行符。

%s告诉printf它将要打印的第一个arg应该打印成一个字符串。

请参阅:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

这是一个非常简单的程序。在你问这个问题的时候,你可以自己编译并运行程序并看到答案。你做得最好。

答案 3 :(得分:0)

printf("%s","K\n"); - 此语句包含两个字符串文字%s ans k\n。这两个字符串文字将作为只读数据在文本分段中。现在考虑1000是字符串文字%s的地址,2000是字符串文字k\n的地址。 10002000将是两个争论,将传递给printf

printf("%s","K\n");

这可以写成如下方式

...
char *a = "%s";  //Address 1000 is stored in a
char *b = "k\n"; //Address 2000 is stored in b
printf(a,b);     //Now we are passing 1000 and 2000 to printf
...

而且我想告诉你,下面的方法也可以打印一个字符串。

...
char *a = "hello world"
printf(a); //This will print hello world
...