2014-04-19 174 views
-1

我試圖使用C++模塊內部的snprintf,使用此代碼:C++:從'const char *'無效轉換爲'size_t'?

snprintf(err, "%s%s", "Fatal Error! ", err); 

,但我得到的, 當「從‘爲const char *’到‘的size_t’轉換無效」錯誤編譯我的程序,那麼如何解決這個問題呢?謝謝。

+2

您是否閱讀過snprintf的文檔,特別是參數? http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

int snprintf(char * str,size_t size,const char * format,...); –

+1

即使添加緩衝區的大小,也不能將'err'作爲參數傳遞給'...'以進行格式化和作爲輸出緩衝區。 –

回答

2

snprintf原型如下:

int snprintf(char *str, size_t size, const char *format, ...) 

論證兩者應該是你的字符緩衝區(即err),在這裏有您的格式字符串的最大尺寸。它用作「更安全」sprintf,因爲該函數不會將多於size字節的數據寫入緩衝區,因此可以採用某種方式來防止溢出。在這種情況下,我以爲你只是想使用標準sprintf,其原型如下:

int sprintf(char *str, const char *format, ...); 
+0

是啊,你說得對,我在snprintf和sprintf之間感到困惑,我必須用sprintf來代替,謝謝,真的有幫助! – user3464495

+0

不用擔心!如果有幫助,請標記爲答案。儘管Daniel Frey在帖子評論中提到過,但你不能寫入「err」並同時讀取它。從邏輯上考慮它,它會嘗試寫入它來編寫「致命錯誤」字符串,然後從中讀取並寫入其餘字符,而不刪除NULL結束符。我實際上並不知道會發生什麼,但我的直覺是它會寫出「致命的錯誤!」無限次數,直到它segfaults。 – slugonamission

+0

我明白了,好的。 – user3464495

1

在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指向的字符數組的大小。

+0

爲C原型+1。輸出爲'char * restrict'意味着使用'err'作爲輸入和變量長度參數之一是未定義的行爲。 –

+0

@David Hammen你是對的。 –

相關問題