Я продолжал получать ошибку, когда добавлял каскадные comboboxes в свое приложение WPF и разрешал ошибку с помощью этого API:
using System.Windows.Data;
private readonly object _lock = new object();
private CustomObservableCollection _myUiBoundProperty;
public CustomObservableCollection MyUiBoundProperty
{
get { return _myUiBoundProperty; }
set
{
if (value == _myUiBoundProperty) return;
_myUiBoundProperty = value;
NotifyPropertyChanged(nameof(MyUiBoundProperty));
}
}
public MyViewModelCtor(INavigationService navigationService)
{
// Other code...
BindingOperations.EnableCollectionSynchronization(AvailableDefectSubCategories, _lock );
}
Этот вопрос о StackOverflow имеет подобное обсуждение. Также в том вопросе я представляю свое любимое решение, функция "формата", которая берет идентичные аргументы printf и возвращает станд.:: строка.
Можно использовать:
std::snprintf
, если Вы работаете с символом*
std::stringstream
, если Вы хотите использовать строки (не то же как printf, но позволит Вам легко управлять строкой с помощью нормальных функций потока).
boost::format
, если Вы хотите функцию, подобную printf, который будет работать с потоками. (согласно jalf в комментариях)
fmt::format
, который стандартизируется и, вероятно, станет std::format
snprintf()
функция печатает к строке, но только так же как длина, данная ему.
Мог бы быть тем, что Вы ищете...
Так как Вы отметили это как C++ (а не просто C), я укажу, что типичный способ сделать этот вид вещи в C++ состоит в том, чтобы использовать stringstream, не printf семья. Никакая потребность волноваться о переполнении буфера с stringstreams.
библиотека Boost Format также доступна, если Вы любите строки формата printf-стиля, но хотите что-то более безопасное.
Старая школа:
snprintf()
позволяет, Вы, чтобы поместить предел на записанное число, и возвратить фактический записанный размер, и
asprintf()
выделяете (с malloc()
) достаточный буфер, который тогда становится Вашей проблемой к free()
. 'asprintf является GNU libc функция, теперь повторно реализованная в BSD libc.
snprintf () возвращается, число байтов должно было записать целую строку. Так, как крошечный пример:
#include <strings.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
char* buf = 0;
size_t bufsize = 0;
size_t sz;
const char* format="%s and %s.";
const char* str_1 ="string 1";
const char* str_2 ="string 2";
sz = snprintf(buf, bufsize, format, str_1, str_2);
printf("The buffer needs to be %d bytes.\n", sz);
buf=malloc(sz+1);
if(!buf) {
printf("Can't allocate buffer!\n");
return 1;
}
bufsize = sz+1;
buf[bufsize-1] = '\0';
sz = snprintf(buf, bufsize, format, str_1, str_2);
printf("Filled buffer with %d bytes.\n", sz);
printf("The buffer contains:\n'%s'\n", buf);
return 0;
}
вывод:
The buffer needs to be 22 bytes.
Filled buffer with 22 bytes.
The buffer contains:
'string 1 and string 2.'
С C99 у Вас есть snprintf-функция, которая берет размер буфера в качестве параметра. C-библиотека GNU имеет asprintf, который выделяет буфер для Вас. Для C++, хотя, Вы могли бы быть лучше из использования iostream.
Википедия имеет больше информации
Я нахожу, что printf, форматирующий, очень полезен и легче использовать, чем потоки. С другой стороны, мне действительно нравится станд.:: представьте много в виде строки также. Решение состоит в том, чтобы использовать sprintf, но это не может обработать произвольный размер буфера.
я нашел, что должен обработать общий падеж (скажите, буферизуйте ограниченный 256 символами), w/o наверху, и все же обрабатывают большой буфер безопасно. Чтобы сделать это, у меня есть буфер 256 символов, выделенных в моем классе как участник, и я использую snprinf, передавая тот буфер и его размер. Если snprintf успешно выполняется, я сразу могу retunr отформатированная строка. Если это перестало работать, я выделяю буфер и называю snprinf снова. Буфер освобожден в деструкторе класса.
В Windows:
StringCchPrintf
StringCbPrintf
от strsafe.h/lib
.
Microsoft представляет' безопасный ' crt функции для этого.
Вы могли использовать printf_s ()