打印字符数组的前几个字符?

时间:2012-08-08 16:11:01

标签: c arrays printf

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

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

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

4 个答案:

答案 0 :(得分:10)

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

  

7.21.6.1 - 8

     

如果指定精度,则不超过那么多字节   书面。如果精度未指定或大于尺寸   对于数组,数组应包含一个空字符。

答案 1 :(得分:2)

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

答案 2 :(得分: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;
}

Fint w = 71;)未打印。

答案 3 :(得分:0)

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