[EDIT] вставляется NULL, завершается в образцахva_list и символьные строки *
У меня есть функция, которая принимает va_list
, который заканчивается с NULL
. Я объединяю каждую строку в char*
под названием joinedString
. Функция работает, как ожидалось, за исключением того, что мой joinedString
растет каждый раз, когда я вызываю эту функцию. Я имею в виду, что предыдущая строка остается и новая строка соединена.
Пример: Первый вызов:
ShowMsg(style1, "a", "s", "d", NULL);
Поддавшись Результат: "ASD"
Второй вызов:
ShowMsg(style1, "w", "w", "q", NULL);
Поддавшись Результат: "asdwwq"
Такое поведение является странно, потому что каждый раз, когда эта функция называется joinedString
инициализируется. Использует ли va_list ранее используемые значения? Я использую C, а не C++, и я знаю, что использование std :: string будет намного проще.
int ShowMsg(MSGBOXSTYLE msgStyle, char* str, ...)
{
char* title = "", *joinedString = "", *theArg = "";
wchar_t* convertedTitle = "", *convertedString = "";
va_list args;
theArg = str;
va_start(args, str);
while(theArg != NULL)
{
if(msgStyle == WARN)
{
title = theArg;
}
else
{
strcat(joinedString, theArg);
strcat(joinedString, "\n\r");
}
theArg = va_arg(args, char*);
}
va_end(args);
...
convertedTitle = (wchar_t*)malloc((strlen(title)+1)*sizeof(wchar_t));
convertedString = (wchar_t*)malloc((strlen(joinedString)+1)*sizeof(wchar_t));
mbstowcs(convertedTitle, title, strlen(title)+1);
mbstowcs(convertedString, joinedString, strlen(joinedString)+1);
...
free(convertedTitle);
free(convertedString);
}
«Такое поведение является странным, потому что каждый раз, когда эта функция вызывается joinString инициализируется «всегда инициализируется указателем на ту же строку (« »), и вы изменяете ее после того, как это небезопасно. Используйте malloc для выделения памяти для char * vars. – ShPavel
Ваш 'strcat (joinString ...' выглядит очень подозрительно для меня. Сколько пространства присваивается joinString? Это похоже на один байт для меня. –
Другая проблема: в ваших образцах вы не заканчиваете список параметров с помощью NULL, это должно быть «ShowMsg (style1,« a »,« s »,« d », NULL); –