2016-04-25 3 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

'символ [100]' не переуступка. Вы не можете назначить 'char [100]'. –

+3

'sizeof (buf_test)' это даст размер указателя, а не массив. Узнайте о массивах и функциях. – 2501

+0

Изменить тип возврата на 'void'. (например, 'void callMe (') и delete '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 к нему будет возвращать размер указателя. Так как вы получаете «Test 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