【发布时间】:2012-08-20 15:22:18
【问题描述】:
我们怎样才能写出这样的语法
#include<stdio.h>
main()
{
char *str;
str="%s";
printf(str,"K\n");
return 0;
}
printf 语句有效吗?
【问题讨论】:
-
停止。关闭浏览器。获取K&R、Practical C programming 和/或Head First C 的副本。 阅读。
我们怎样才能写出这样的语法
#include<stdio.h>
main()
{
char *str;
str="%s";
printf(str,"K\n");
return 0;
}
printf 语句有效吗?
【问题讨论】:
对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 的无效规范。
const :( 确切地说是UB。如果类型为const 限定,则将违反约束并强制进行诊断。然后,没有指针和数组不是一回事。字符串文字的大小信息sizeof "ha" 是3。
是的,它是有效的,因为您的 str 是 char * 类型。这是printf的原型:
int printf ( const char * format, ... );
从被调用函数的角度来看,你的语句会是这样的:
printf("%s","K\n");
"%s" 和 "K\n" 是 char * 类型的常量表达式。
【讨论】:
printf调用无效,因为他没有在main中指定返回类型?
是的,语法是有效的。这个程序的结果是字符串“K\n”
其中 \n 表示换行符。
%s 告诉 printf 它将打印的第一个 arg 应该打印为字符串。
看到这个:http://www.cplusplus.com/reference/clibrary/cstdio/printf/
这是一个非常简单的程序。在您提出这个问题的时间里,您本可以自己编译并运行程序并看到答案。你通过实践学得最好。
【讨论】:
printf("%s","K\n"); - 此语句有两个字符串文字 %s 和 k\n。这两个字符串文字将在文本段中作为只读数据。现在考虑1000 是字符串文字%s 的地址,2000 是字符串文字k\n 的地址。 1000 和 2000 将是两个参数,它们将传递给 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
...
【讨论】: