Bil*_*ina 70 c string-formatting
为什么C的printf格式字符串有%c和%s?
我知道它%c代表一个单个字符并%s表示一个以空字符结尾的字符串,但单独的字符串表示不足够吗?
Mah*_*esh 98
可能要区分空终止字符串和字符.如果他们只有%s,那么每个字符也必须为空终止.
char c = 'a';
Run Code Online (Sandbox Code Playgroud)
在上述情况下,c必须以null结尾.这是我的假设:)
Luc*_*ore 73
%s打印出字符,直到它达到0(或'\0'同样的东西).
如果你有一个char x;,打印它printf("%s", &x);- 你必须提供地址,因为%s预期char* - 会产生意想不到的结果,&x + 1可能不会0.
所以你不能只打印一个字符,除非它是以null结尾的(非常无效).
编辑:正如其他人所指出的,两者期望var args参数中有不同的东西 - 一个是指针,另一个是一个char.但这种差异有点明显.
Jen*_*edt 38
其他人提到单个字符必须为空终止的问题并不是真正的问题.这可以通过提供格式的精确度来解决%.1s.
在我看来更重要的是,对于%s任何形式,你必须提供指向一个或多个字符的指针.这意味着您将无法打印rvalues(计算表达式,函数返回等)或注册变量.
编辑:我对这个答案的反应非常生气,所以我可能会删除它,这真的不值得.似乎人们在没有阅读问题或知道如何理解问题的技术性的情况下对此作出反应.
为了说清楚:我不说,你应该更喜欢%.1s了%c.我只是说为什么%c不能替换的原因不同于其他答案假装告诉.这些其他答案在技术上是错误的.空终止不是问题%s.
And*_*rsK 28
printf函数是一个可变函数,意味着它具有可变数量的参数.在调用函数(printf)之前,会在堆栈上推送参数.为了使函数printf能够使用堆栈,它需要知道有关堆栈中的内容的信息,格式字符串用于此目的.
例如
printf( "%c", ch ); tells the function the argument 'ch'
is to be interpreted as a character and sizeof(char)
Run Code Online (Sandbox Code Playgroud)
而
printf( "%s", s ); tells the function the argument 's' is a pointer
to a null terminated string sizeof(char*)
Run Code Online (Sandbox Code Playgroud)
printf函数内部不可能以其他方式确定堆栈内容,例如区分'ch'和's',因为在C中运行时没有类型检查.
Jua*_*des 13
%s 说打印所有字符,直到找到null(将变量视为指针).
%c 说只打印一个字符(将变量视为字符代码)
%s对于一个字符的使用不起作用,因为该字符将被视为一个指针,然后它将尝试打印该位置之后的所有字符,直到它找到一个空
从其他答案窃取,以不同的方式解释它.
如果您想使用打印字符%s,可以使用以下内容正确传递一个字符的地址,并防止它在屏幕上写垃圾,直到找到空值.
char c = 'c';
printf('%.1s', &c);
Run Code Online (Sandbox Code Playgroud)
我想为这个有趣的问题添加另一个观点.
真的,这归结为数据输入.我在这里看到的答案表明你可以提供一个指向char的指针,并提供一个
"%.1s"
Run Code Online (Sandbox Code Playgroud)
这确实可能是真的.但答案在于C设计师试图为程序员提供灵活性,实际上是一种(虽然很小)减少应用程序占用空间的方法.
有时程序员可能想运行一系列if-else语句或switch-case,其中需要简单地根据状态输出一个字符.为此,对字符进行硬编码确实可以减少内存中的实际空间,因为单个字符是8位而不是指针是32位或64位(对于64位计算机).指针将在内存中占用更多空间.
如果您希望通过使用实际字符与指向字符的指针来减小大小,那么有两种方法可以考虑在printf类型的运算符中执行此操作.一个是关闭.1s,但是例程应该如何确定你真正提供了一个char类型而不是一个指向char的指针或一个指向字符串的指针(chars数组)?这就是为什么他们选择"%c",因为它是不同的.
有趣的问题:-)