【问题标题】:can we pass the address of the format specifier string to printf我们可以将格式说明符字符串的地址传递给 printf
【发布时间】:2012-08-20 15:22:18
【问题描述】:

我们怎样才能写出这样的语法

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

printf 语句有效吗?

【问题讨论】:

标签: c pointers char printf


【解决方案1】:

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";

【讨论】:

  • 不幸的是,字符串文字的类型是char[](不是指针,也不是const)。您还错过了main 的无效规范。
  • @JensGustedt 什么?不是常数?我一直以为是const。顺便说一句,无论是数组还是指针,都不是那么无所谓吗?它只是一维的,我不想为字符串文字分配任何东西,所以实际上它可以用作指针。并且修改其内容未定义的行为,所以它必须是 const...
  • 不,不是const :( 确切地说是UB。如果类型为const 限定,则将违反约束并强制进行诊断。然后,没有指针和数组不是一回事。字符串文字的大小信息sizeof "ha" 是3。
  • @JensGustedt 是的,我知道数组不是指针。我的意思是说他们在这里的行为是一样的。 (我知道 sizeof 存在差异,但这与 const 正确性的问题无关。)
【解决方案2】:

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

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

从被调用函数的角度来看,你的语句会是这样的:

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

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

【讨论】:

  • 你是说printf调用无效,因为他没有在main中指定返回类型?
【解决方案3】:

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

其中 \n 表示换行符。

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

看到这个:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

这是一个非常简单的程序。在您提出这个问题的时间里,您本可以自己编译并运行程序并看到答案。你通过实践学得最好。

【讨论】:

    【解决方案4】:

    printf("%s","K\n"); - 此语句有两个字符串文字 %sk\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
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-08-04
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2017-11-16
      • 1970-01-01
      相关资源
      最近更新 更多