Я работаю в устаревшей кодовой базе, которая использовала unsigned char*
s, чтобы содержать строки. Для моей функциональности я использовал string
с, но есть руб:Является ли законным лишить знак на указателе?
Я ничего не могу использовать в #include <cstring>
в старом коде. Копирование с string
на unsigned char*
трудоемкий процесс:
unsigned char foo[12];
string bar{"Lorem Ipsum"};
transform(bar.cbegin(), bar.cbegin() + min(sizeof(foo)/sizeof(foo[0]), bar.size()), foo, [](auto i){return static_cast<unsigned char>(i);});
foo[sizeof(foo)/sizeof(foo[0]) - 1] = '\0';
Я собираюсь попасть в неопределенное поведение или алиасов проблемы, если я просто делаю:
strncpy(reinterpret_cast<char*>(foo), bar.c_str(), sizeof(foo)/sizeof(foo[0]) - 1);
foo[sizeof(foo)/sizeof(foo[0]) - 1] = '\0';
Вам нужна кросс-платформа здесь? Готовы ли вы согласиться на то, что работает на вашей нынешней платформе, даже если это может быть UB в стандарте C++? 'char' гарантированно будет иметь такое же представление, как один из' signed char' или 'unsigned char', и даже в случае' signed', вы, вероятно, будете безопасны со строго данными ACSII: '[0,127]'. – BoBTFish
@BeyelerStudios Это ASCII. –
Должно ли это быть 'static_cast или просто в стиле c? –