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++)){}
看看结果,
木有了是不是