c printf()以及由此引发一连串血案

c printf()是最简单的函数,定义在 stdio.h 中,只要声明了 stdio.h ,就能够使用printf(),事实上,每一个c 程序都会包含stdio.h。
至于什么("%d"),("%f"),("%c")咱们不说了,谁都会,没什么要说的,咱们说说("%s"),以及由("%s")引发出来的一系列问题。
首先,从最sb的开始:(环境Vs2010C++ console 程序)

void main()
{
    char *m="11111";
    char *k=m;
    printf("%s\n",k);
    int d=0;
    scanf("%d",d);
}

屏幕上果断打印出11111。

void main()
{
    char *m="11111";
    char *n=(char *)malloc(4);
    char *k=n;
    while(*m!='\0')
    {
    *n=*m;
    n++;
    m++;
    }
    char * y= "5";
    *n++='2';
    *n++='2';
    *n++='3';
    *n++='\0';
    *n++=*y;
    printf("%s\n",k);
    int d=0;
    scanf("%d",d);
}

 

看这段代码,y是一个指向“5”的指针,屏幕果断打印1111223,跟踪


发现指针指向3以后又指向了0,然后指向了5,为什么屏幕没有显示出来,我打印的是整个指针啊,
这里因为指针是一个字符串,字符串结束符是‘\0’,也就是说printf打印字符串的时候("%s")是以'\0'结尾的,只要发现'\0',打印结束,也就是说("%s")并不是循环打印所有指针内容,而是以某些符号判断结束的。
所以,指针虽然指向了'\0',但是指针依然在继续指向,没有结束。名表了为什么打印没有完全,继续:
假设y指针不是一个字符,而是一堆字符呢?

void main()
{
    char *m="11111";
    char *n=(char *)malloc(4);
    char *k=n;
    while(*m!='\0')
    {
    *n=*m;
    n++;
    m++;
    }
    char * y= "56789";
    *n++='2';
    *n++='2';
    *n++='3';
    *n++='\0';
    *n=*y;
    printf("%s\n",k);
    int d=0;
    scanf("%d",d);
}

我们再跟踪看一下

从n开始,后面,也没有任何指向地址,也就是说,即使你赋予了另一个一串字符串,新来的指针依然只会指向第一个,而不会自动移动。
想让他指向,我们需要把指针依次+1然后赋值,好,问题又来了,我们可以这么写:

void main()
{
    char *m="11111";
    char *n=(char *)malloc(4);
    char *k=n;
    while(*m!='\0')
    {
    *n=*m;
    n++;
    m++;
    }
    char * y= "56789";
    *n++='2';
    *n++='2';
    *n++='3';
    *n++='\0';
    while(*y!='\0')
    {
    *n=*y;
    y++;
    n++;
    }
    //*n=*y;
    printf("%s\n",k);
    int d=0;
    scanf("%d",d);
}

然后看看结果

他逐个赋值了,然后,我的意思是,这写法太普通了,有没有拉风一点的写法,我们是牛逼的程序员,拉风一点不是很符合我们的形象吗?
这个!必须有!有那种职业不程序员还拉风?

void main()
{
    char *m="11111";
    char *n=(char *)malloc(4);
    char *k=n;
    while(*m!='\0')
    {
    *n=*m;
    n++;
    m++;
    }
    char * y= "56789";
    *n++='2';
    *n++='2';
    *n++='3';
    *n++='\0';
    //while(*y!='\0')
    //{
    //*n=*y;
    //y++;
    //n++;
    //}
    while((*n++=*y++)!='\0'){}
    printf("%s\n",k);
    int d=0;
    scanf("%d",d);
}

 

拉不拉风,一句话,搞定,而且结果也一样,重要的是,会有相当一部分人看不懂这是什么意思,嘿嘿,嘿嘿!

哦,不对!他多了一个0,也就多了一个结束符,这是怎么了
说说*n++=*y++;

等同于*n=*y;n++;y++;

判断的时候,    while((*n++=*y++)!='\0'){},这里,我们换一下    while((*y!='\0')&&(*n++=*y++)){}
看看结果,

木有了是不是

posted @ 2012-08-03 15:27  爱喝可乐  阅读(1692)  评论(0编辑  收藏  举报