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,跟踪

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

发现指针指向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);
}

我们再跟踪看一下

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

从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);
}

然后看看结果

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

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

这个!必须有!有那种职业不程序员还拉风?

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);
}

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

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

哦,不对!他多了一个0,也就多了一个结束符,这是怎么了

说说n++=y++;

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

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

看看结果,

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

木有了是不是
原文链接: https://www.cnblogs.com/fish124423/archive/2012/08/03/2621720.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/57796

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午8:25
下一篇 2023年2月9日 上午8:26

相关推荐