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解禁。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.