2016-04-25 257 views
0

我的代碼:錯誤消息

#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 

char * callMe(char *buf_test, const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    vsnprintf(buf_test, sizeof(buf_test), fmt, ap); 
    va_end(ap); 
    return buf_test; 
} 

int main() 
{ 
    char buf_t[100]; 
    int test_flag =1; 
    buf_t = callMe(buf_t, "Test successful : %d", test_flag); 
    printf("\n\n Result = %s", buf_t); 
} 

錯誤:

error: array type 'char [100]' is not assignable 
    buf_t = callMe(buf_t, "Test successful : %d", test_flag); 
    ~~~~~^
1 error generated. 
+1

'的char [100]'不轉讓。你不能指定一個'char [100]'。 –

+3

'sizeof(buf_test)'這將給出指針的大小,而不是數組。瞭解數組和函數。 – 2501

+0

將返回類型更改爲void。 (例如'void callMe(')並刪除'return buf_test;' – BLUEPIXY

回答

1

您不能分配到一個數組。你需要說的是這樣的:

char *result = callMe(buf_t, "Test successful : %d", test_flag); 
printf("\n\n Result = %s", result); 

你還要用這條線的一個問題:

vsnprintf(buf_test, sizeof(buf_test), fmt, ap); 

buf_test被delcared爲char*因此應用sizeof都將返回大小的指針。既然你得到了「測試su」,它就意味着指針的大小是8字節,儘管變量指向了一個數組,編譯器無法推斷出這個結果。

你需要的是傳遞大小緩衝區進入功能:

char * callMe(char *buf_test, size_t size, const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    vsnprintf(buf_test, size, fmt, ap); 
    va_end(ap); 
    return buf_test; 
} 

,然後通過大小,當你撥打電話:

callMe(buf_t, sizeof(buf_t), "Test successful : %d", test_flag); 

編譯器將能夠工作在這裏的數組的大小,因爲它可以訪問變量的完整定義

+1

加上你甚至不需要返回值,因爲'buf_test'已經被修改了 –

+0

我必須返回char *。 snprintf是非常昂貴的函數,所以你應該總是返回char *。 – Rock26

+0

@ Rock26 - 它返回一個'char *'。問題出在你指定它的地方。你不能在C中分配一個數組,這是爲什麼你會得到錯誤 – Sean

-1

如錯誤所示,您無法將結果分配給數組。

buf_t = callMe(buf_t, "Test successful : %d", test_flag); 

到:相反,你可以通過改變這條線使用指針

char *success; 
success = callMe(buf_t, "Test successful : %d", test_flag); 

,因此修改print聲明:

printf("\n\n Result = %s", success); 
+0

感謝您的及時回覆。我修改了我的代碼,它工作。但我無法得到預期的結果。我的輸出結果是:「Result = Test su」而不是「Test Successful:1」 – Rock26

+0

@ Rock26可能檢查了'vsnprintf(buf_test,sizeof(buf_test),fmt,ap)'這行''以確保'buf_test'有正確的價值嗎? – Marievi