IlyaVishnikin
@IlyaVishnikin

Почему вместо строки появляется мусор?

Есть функция, которая возвращает отформатированный XPath:
char* xpath_format(const char* xpath, ...)
{
	va_list arguments;
	va_start(arguments, xpath);

	size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments);
	char* xpath_formatted = malloc(xpath_formatted_size);
	vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);

	va_end(arguments);
	return xpath_formatted;
}

и собственно её вызов:
int main(void)
{
	char* xpath_formatted = xpath_format("//%s[@%s=\"%s\"]", "vault", "name", "vault-name");
	printf("%s\n", xpath_formatted);
	free(xpath_formatted);

	exit(EXIT_SUCCESS);
}


Но на выходе вместо ожидаемой строки //vault[@name="vault-name"] поялвяется только мусор вида "//[��UH��AWAVAUATSH��8L�%�I="(null)"]".

Как это исправить?
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему вместо строки появляется мусор?
size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments);
  char* xpath_formatted = malloc(xpath_formatted_size);
  vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);


Потому что 1) результат возвращаемый vsnprintf не включает конечный 0, а вот аргумент vsnprintf обозначающий размер буфера должен включать место для конечного 0. И 2) вызов vsnprintf(…, arguments) меняет arguments.

Как это исправить?

Как-то так:
char* xpath_format(const char* xpath, ...)
{
  va_list arguments;
  va_start(arguments, xpath);

  size_t xpath_formatted_size = vsnprintf(NULL, 0, xpath, arguments) + 1;
  va_end(arguments);
  va_start(arguments, xpath);
  char* xpath_formatted = malloc(xpath_formatted_size);
  vsnprintf(xpath_formatted, xpath_formatted_size, xpath, arguments);

  va_end(arguments);
  return xpath_formatted;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы