Лучший способ к безопасно printf к строке? [дубликат]

Я продолжал получать ошибку, когда добавлял каскадные 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 );

    }

Подробнее см. в https: // msdn .microsoft.com / запроса / dev14.query APPID = Dev14IDEF1 & амп;? л = EN-US & Amp; K = K (System.Windows.Data.BindingOperations.EnableCollectionSynchronization); к (TargetFrameworkMoniker-.NETFramework, версия% 3Dv4.7); к (DevLang-CSharp) & амп; й = истинно [/ д2]

16
задан Adam Peck 12 January 2009 в 18:30
поделиться

10 ответов

Этот вопрос о StackOverflow имеет подобное обсуждение. Также в том вопросе я представляю свое любимое решение, функция "формата", которая берет идентичные аргументы printf и возвращает станд.:: строка.

4
ответ дан 30 November 2019 в 15:16
поделиться

Можно использовать:

std::snprintf , если Вы работаете с символом*

std::stringstream , если Вы хотите использовать строки (не то же как printf, но позволит Вам легко управлять строкой с помощью нормальных функций потока).

boost::format , если Вы хотите функцию, подобную printf, который будет работать с потоками. (согласно jalf в комментариях)

fmt::format , который стандартизируется и, вероятно, станет std::format

28
ответ дан 30 November 2019 в 15:16
поделиться

snprintf() функция печатает к строке, но только так же как длина, данная ему.

Мог бы быть тем, что Вы ищете...

11
ответ дан 30 November 2019 в 15:16
поделиться

Так как Вы отметили это как C++ (а не просто C), я укажу, что типичный способ сделать этот вид вещи в C++ состоит в том, чтобы использовать stringstream, не printf семья. Никакая потребность волноваться о переполнении буфера с stringstreams.

библиотека Boost Format также доступна, если Вы любите строки формата printf-стиля, но хотите что-то более безопасное.

5
ответ дан 30 November 2019 в 15:16
поделиться

Старая школа:

snprintf()

позволяет, Вы, чтобы поместить предел на записанное число, и возвратить фактический записанный размер, и

asprintf()

выделяете (с malloc()) достаточный буфер, который тогда становится Вашей проблемой к free(). 'asprintf является GNU libc функция, теперь повторно реализованная в BSD libc.

4
ответ дан 30 November 2019 в 15:16
поделиться

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.'
4
ответ дан 30 November 2019 в 15:16
поделиться

С C99 у Вас есть snprintf-функция, которая берет размер буфера в качестве параметра. C-библиотека GNU имеет asprintf, который выделяет буфер для Вас. Для C++, хотя, Вы могли бы быть лучше из использования iostream.

Википедия имеет больше информации

1
ответ дан 30 November 2019 в 15:16
поделиться

Я нахожу, что printf, форматирующий, очень полезен и легче использовать, чем потоки. С другой стороны, мне действительно нравится станд.:: представьте много в виде строки также. Решение состоит в том, чтобы использовать sprintf, но это не может обработать произвольный размер буфера.

я нашел, что должен обработать общий падеж (скажите, буферизуйте ограниченный 256 символами), w/o наверху, и все же обрабатывают большой буфер безопасно. Чтобы сделать это, у меня есть буфер 256 символов, выделенных в моем классе как участник, и я использую snprinf, передавая тот буфер и его размер. Если snprintf успешно выполняется, я сразу могу retunr отформатированная строка. Если это перестало работать, я выделяю буфер и называю snprinf снова. Буфер освобожден в деструкторе класса.

1
ответ дан 30 November 2019 в 15:16
поделиться

В Windows:

StringCchPrintf
StringCbPrintf

от strsafe.h/lib.

0
ответ дан 30 November 2019 в 15:16
поделиться

Microsoft представляет' безопасный ' crt функции для этого.

Вы могли использовать printf_s ()

-1
ответ дан 30 November 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: