2

嗨,我有一个简单的代码,它打印一个字符数组的三个字符,如下所示

void main()
{
    char str[]={65,66,67};
    printf("%.3s",str);
}

这给出了输出ABC,但我想知道因为这不是字符串意味着它不是空终止的,那么如何%s处理它并给出正确的结果?

4

4 回答 4

10

由于您传递了字符串的长度,因此 printf 不需要 0 终止符。

7.21.6.1 - 8

如果指定了精度,则写入的字节数不会超过。如果未指定精度或大于数组的大小,则数组应包含空字符。

于 2012-08-08T16:12:09.593 回答
2

它之所以有效,是因为您提供了一个精度修饰符。%.3s 字面意思是从输入打印前 3 个字节。如果您要删除修饰符(“%.3s”->“%s”),此代码仍将无错误地构建,但运行时结果是不可预测的(并且欢迎利用)。

于 2012-08-08T16:21:48.557 回答
0

为了澄清上面的答案(@cnicutar 和 dans3itz):以下代码打印“ABCDE”,即printf扫描数组到第一个空字符(0 字节):

#include <stdio.h>

int main() {
    char str[]={65,66,67};
    char c = 68; 
    int x = 69; 
    int y = 70; 
    int z = 0;
    int w = 71;
    printf("%s", str);
    return 0;
}

F( int w = 71;) 不打印。

于 2012-08-08T16:25:11.690 回答
0

@khachik 我不认为该片段按您预期的那样运行。我无法使用 GCC 4.2 在 OS X 上重现结果;4.7 或 Clang 3.1

于 2012-08-08T16:46:10.750 回答