Если вы интерпретируете это как «сортировать по каждому сегменту цифр», тогда вы будете обрабатывать ваш пример ввода выше:
input.map{ |ver| ver.split(%r{[^\d]+}).map(&:to_i) }.zip(input).sort.map(&:last)
=> ["9_0", "9_1", "10_0b3", "10_0b12"]
То есть,
10_0b3
["10","0","3"]
[10,0,3]
[[[10, 0, 12], "10_0b12"], [[10, 0, 3], "10_0b3"], [[9, 0], "9_0"], [[9, 1], "9_1"]]
[10,0,3] < [10,0,12]
. Теперь предоставлено, это все еще довольно обычай - номера версий, такие же простые, как «9_0a» против «9_0b», не будут обрабатываться, обе будут отображаться [9,0] - так что вам, возможно, придется еще больше подстроить его, но, надеюсь, это приведет вас к жизнеспособному пути.
EDIT: Пример ввода выше изменен, поэтому я изменил регулярное выражение, чтобы убедиться, что цифра -мачание жадно, и с этим он все еще держится:
irb(main):018:0> input = ['10.0.0b12', '10.0.0b3', '9.0.10', '9.0.3']
=> ["10.0.0b12", "10.0.0b3", "9.0.10", "9.0.3"]
irb(main):025:0> input.map{ |ver| ver.split(%r{[^\d]+}).map(&:to_i) }.zip(input).sort.map(&:last)
=> ["9.0.3", "9.0.10", "10.0.0b3", "10.0.0b12"]
Если Вам просто будет нужен доступ только для чтения, то c_str()
сделает это:
char const *c = myString.c_str();
при необходимости в доступе для чтения-записи, затем можно скопировать строку в вектор. векторы управляют динамической памятью для Вас. Вы не должны смешивать с выделением/освобождением затем:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
std::string::data
, казалось бы, был бы достаточным и самым эффективным. Если Вы хотите иметь память неконстанты для управления (странный для шифрования), можно скопировать данные в буфер с помощью memcpy:
unsigned char buffer[mystring.length()];
memcpy(buffer, mystring.data(), mystring.length());
фанаты STL поощрили бы Вас использовать станд.:: копия вместо этого:
std::copy(mystring.begin(), mystring.end(), buffer);
, но действительно нет большой части позитивного аспекта к этому. Если бы Вам нужно пустое использование завершения std::string::c_str()
, и различные строковые другие методов дублирования обеспечили, но я обычно избегал бы, чтобы и просто запросили для length
. Особенно с криптографией Вы просто знаете, что кто-то собирается попытаться повредиться, она пиханием аннулирует в к нему, и использование std::string::data()
обескураживает Вас от ленивого создания предположений о базовых битах в строке.
От станд.:: строка можно использовать c_ptr () метод, если Вы хотите достигнуть буферный указатель char_t.
похоже, что Вы просто хотите, копируют символы строки в новый буфер. Я просто использовал бы станд.:: строка:: копия функция:
length = str.copy( buffer, str.size() );
Обычно, функции шифрования берут
encrypt(const void *ptr, size_t bufferSize);
как аргументы. Можно передать c_str и длину непосредственно:
encrypt(strng.c_str(), strng.length());
Таким образом, дополнительное место выделено или потрачено впустую.
Если просто необходимо считать данные.
encrypt(str.data(),str.size());
, Если Вам нужна копия чтения-записи данных, помещает его в вектор. (Дон; t динамично выделяют место, это - задание вектора).
std::vector<byte> source(str.begin(),str.end());
encrypt(&source[0],source.size());
, Конечно, мы все предполагаем, что байт является символом!!!
Если это - просто ванильный C, то:
strcpy(buffer, text.c_str());
Предположение, что буфер выделяется и достаточно большой для содержания содержания 'текста', который является предположением в исходном коде.
, Если шифруют () берет 'символ константы *', затем можно использовать
encrypt(text.c_str())
, и Вы не должны копировать строку.
Я не думаю, что Вы хотите использовать c# код, который Вы имеете там. Они обеспечивают Систему. Текст. Кодирование. ASCII (также UTF -*)
string str = "some text;
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
Ваши проблемы останавливает от игнорирования кодирования в c# не Ваш код C++