c陷阱與缺陷_知識點整理

QaoAma發表於2015-05-07

首先是別人的這篇部落格http://blog.csdn.net/famousdt/article/details/7399764


自己覺得漏掉的知識點

1、“0123456789”[i] 這是一種很好的技巧,保證你輸出的字元是0~9之間的,無論什麼字符集

2、

在VS2013編譯器的環境下

unsigned int c;
c=-10;//故意作死
printf("%d\n",c);
cout<<c<<endl;
同是輸出函式,但是上面輸出的是10,而下面的那個卻溢位了

3、自己寫的二分法,發現到最後會死迴圈出不去,後來發現真正的二分法會在二分時把新的start和end定義為middle+1和middle-1,很好地避免了上述的問題,對於這個問題在計算機叢書的《資料結構與演算法分析-c語言描述》裡也有相關的探討

4、

	char s1[] = "123456789";
	char *s = s1;
	cout << sizeof(s1) << endl;
	cout << sizeof(s) << endl;

一個輸出的是字串長度,一個輸出的是自己的長度,在這時指標和陣列名不等價

5、

兩個printf列印出來的東西是不一樣的,上面的那個會把s當作格式控制語句輸出,而下面的那個會按字串輸出s

6、三個print:printf,fprintf,sprintf

prinf是大家都用的,但是不能說一定完全會用;fprintf用於輸出到指定檔案,printf(something)相當於fprintf(stdout,something);sprintf()是用於整理字串(個人理解),比如

char s[50];
int a=2,b=3;
sprintf(s,"%d hello world %d",a,b);
這樣的s就是就是"2 hello world 3"


7、格式控制,精度控制,域寬.......

%d,%s,%f,%u(視為無符號整數,不要用於列印char型別的字元),%o(八進位制),%x或者%X(十六進位制列印,大小寫決定了十六進位制的a,b,c,d,e,f,g是大寫還是小寫),%g或者%G用於控制列印出佔位最少的那種格式,%e或者%E(用科學技術法的方式列印字元);

%ld,%lo,%lx,%lu用於宣告我們要列印的long型的;

%5d(若列印的數字只有兩位的話,會在前面添3個空格,不用擔心位數太多會被截斷),甚至可以使用“%m%”這樣來控制輸出(m代表的是一個常數,比如m=5,那程式碼應該寫作%5%);

對於%.5d這樣的格式,如果列印的數是10,那麼列印出來的是:00010,也就是說位數不足會自動補0,這種格式控制對於%d,%o,%x,%u都有效;

對於%f,%e,%E,使用%.5f(%.mf)這種格式是用來控制小數點精度的;

對於%g,使用%5g(%mg)是用來控制輸出有效位置精度的;

對於%s,假設對於“hello world”這個字串,使用%.5s列印出“hello”,使用%.20s則無影響;

對於%c和%%,上述的用法無效;

使用‘-’、'+'和' ',比如:

printf("%-5d",2)
會列印為“2    ”(四個空格,左對齊),也就是說'-'用於左對齊

printf("%+d  &+d",2,-2)
輸出是:+2 -2,也就是說'+'用於強制列印符號

printf("% d\n",-2);//中間有個空格,請注意
printf("% d\n",2);
會發現輸出是對齊的,也就是說' '用於對正數列印空格來控制對齊;
‘#’用於對字元進行微調,細節太多
float a = 2.333;
printf("%*.*f", 6, 2, a);
這樣相當於printf("%6.2f",a);但是由於格式控制的引數都位於外部,所以可以輕鬆地用變數或巨集定義來調整所有輸出的格式;printf("%*%",n);會列印n-1個空格,然後才是%;

還有兩個控制符%p和%n,新增的,百度就知道是什麼了





//如果個人還有相關感悟的話,會把這些感悟繼續加上去。。。。

//如果有錯,還望指正

相關文章