我試圖使用C++模塊內部的snprintf,使用此代碼:C++:從'const char *'無效轉換爲'size_t'?
snprintf(err, "%s%s", "Fatal Error! ", err);
,但我得到的, 當「從‘爲const char *’到‘的size_t’轉換無效」錯誤編譯我的程序,那麼如何解決這個問題呢?謝謝。
我試圖使用C++模塊內部的snprintf,使用此代碼:C++:從'const char *'無效轉換爲'size_t'?
snprintf(err, "%s%s", "Fatal Error! ", err);
,但我得到的, 當「從‘爲const char *’到‘的size_t’轉換無效」錯誤編譯我的程序,那麼如何解決這個問題呢?謝謝。
snprintf
原型如下:
int snprintf(char *str, size_t size, const char *format, ...)
論證兩者應該是你的字符緩衝區(即err
),在這裏有您的格式字符串的最大尺寸。它用作「更安全」sprintf
,因爲該函數不會將多於size
字節的數據寫入緩衝區,因此可以採用某種方式來防止溢出。在這種情況下,我以爲你只是想使用標準sprintf
,其原型如下:
int sprintf(char *str, const char *format, ...);
是啊,你說得對,我在snprintf和sprintf之間感到困惑,我必須用sprintf來代替,謝謝,真的有幫助! – user3464495
不用擔心!如果有幫助,請標記爲答案。儘管Daniel Frey在帖子評論中提到過,但你不能寫入「err」並同時讀取它。從邏輯上考慮它,它會嘗試寫入它來編寫「致命錯誤」字符串,然後從中讀取並寫入其餘字符,而不刪除NULL結束符。我實際上並不知道會發生什麼,但我的直覺是它會寫出「致命的錯誤!」無限次數,直到它segfaults。 – slugonamission
我明白了,好的。 – user3464495
爲什麼不閱讀手冊頁?
你缺少緩衝err
的大小按手動http://linux.die.net/man/3/snprintf
編輯
反正更好的方法來做到這一點在C++ http://www.cplusplus.com/reference/sstream/stringstream/
在C這個函數聲明如下way
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
正如你看到的第二個參數的類型是size_t
但在函數的調用時使用的第二個參數的類型是const char *
snprintf(err, "%s%s", "Fatal Error! ", err);
所以你只需使用函數不正確。
第二個參數指定您要在變量中讀取多少個字符。通常n被設置爲由s指向的字符數組的大小。
爲C原型+1。輸出爲'char * restrict'意味着使用'err'作爲輸入和變量長度參數之一是未定義的行爲。 –
@David Hammen你是對的。 –
您是否閱讀過snprintf的文檔,特別是參數? http://en.cppreference.com/w/cpp/io/c/fprintf –
int snprintf(char * str,size_t size,const char * format,...); –
即使添加緩衝區的大小,也不能將'err'作爲參數傳遞給'...'以進行格式化和作爲輸出緩衝區。 –