printf和sprintf注意點
來源:互聯網
上載者:User
■問題:在要求使用者輸入檔案儲存的路徑後,source中如果有類似sprintf(buff, 入力値)的處理時,一旦入力値中包含”%”, 那麼buff中的期望值就和實際值可能不一樣。例如使用者輸入這樣的路徑: C:\Temp%sfile 那麼 sprintf(path, “C:\Temp%sfile”); path期望值: C:\Temp%sfile Path實際值: C:\Temp(null)file 如果去fopen這樣的path,顯然程式會出問題。 解決方案:在printf之前對%進行過濾,加上轉義符“%” ■問題:在要求使用者輸入檔案儲存的路徑後,source中如果有類似sprintf(buff, 入力値)的處理時,一旦入力値中包含”%”, 那麼buff中的期望值就和實際值可能不一樣。例如使用者輸入這樣的路徑: C:\Temp%sfile 那麼 sprintf(path, “C:\Temp%sfile”); path期望值: C:\Temp%sfile Path實際值: C:\Temp(null)file 如果去fopen這樣的path,顯然程式會出問題。 解決方案:在printf之前對%進行過濾,加上轉義符“%” ■關於%n的問題 void main() { int num1, num2; printf(“12345%n6789%n\n”, &num1, &num2) printf("First count %d Second count %d\n", num1 , num2); } vs2008下編譯後運行拋出斷言錯誤: Expression: (“’n’ format specifier disabled”,0) ■%a,%b,%c……%z都不會出現這種錯誤,唯獨%n 原來,printf族函數中,%n的作用是取得已經列印的字串數目。 printf(“12345%n6789%n\n”, &num1, &num2) 當執行完上面代碼時,結果應該是num1=5,num2=9 但是, 由於printf函數在使用%n存在安全問題,以前經常被駭客利用,所以VS2008在預設的情況下禁止這樣使用。 如果一定要用到%n,那麼可以在用之前加上這樣一行代碼: _set_printf_count_output( int enable ); Enable的值為非0時,printf族函數裡的%n解禁。