Мне нужно получить указатель на завершающий нулевой символ строки.
В настоящее время я использую этот простой способ: MyString + strlen(MyString)
, что, вероятно, весьма неплохо вне контекста.
Однако мне не нравится это решение, так как я должен делать это после копирования строки:
char MyString[32];
char* EndOfString;
strcpy(MyString, "Foo");
EndOfString = MyString + strlen(MyString);
Итак, я дважды зацикливаюсь вокруг строки, первый раз в strcpy
и второй раз в strlen
.
Я бы хотел избежать этих издержек с помощью пользовательской функции, которая возвращает количество скопированных символов:
size_t strcpylen(char *strDestination, const char *strSource)
{
size_t len = 0;
while( *strDestination++ = *strSource++ )
len++;
return len;
}
EndOfString = MyString + strcpylen(MyString, "Foobar");
Однако я боюсь, что моя реализация может быть медленнее, чем функция CRT, предоставляемая компилятором (которая может использовать некоторую оптимизацию сборки или другой прием вместо простого цикла char-by-char). Или, может быть, я не знаю какой-то стандартной встроенной функции, которая уже делает это?
Я провел несколько сравнений с бедными, повторив 0x1FFFFFFF три алгоритма (strcpy
+ strlen
, мою версию strcpylen
и версию user434507 ). Результат:
1) strcpy
+ strlen
- победитель с 967 миллисекундами;
2) моя версия занимает гораздо больше времени: 57 секунд!
3) отредактированная версия занимает 53 секунды.
Таким образом, использование двух функций CRT вместо пользовательской «оптимизированной» версии в моей среде более чем в 50 раз быстрее!