Основные функции стандартной библиотеки не обременяют себя чрезмерно дорогими проверками безопасности, оставляя их пользователю. Большинство проверок безопасности, которые вы выполняете в своей реализации, являются дорогостоящими: совершенно неприемлемо в такой базовой библиотечной функции. Это C, а не Java.
Как только вы получаете некоторые проверки из картинки, функция «подстегнуть» сводится к обычному strlcpy
. Т.е. игнорируя проверку безопасности на startPos
, все, что вам нужно сделать, это
char *substr(const char *inpStr, char *outStr, size_t startPos, size_t strLen) {
strlcpy(outStr, inpStr + startPos, strLen);
return outStr;
}
Хотя strlcpy
не является частью стандартной библиотеки, но его можно грубо заменить на [неправильно использованный] strncpy
. Опять же, игнорируя проверку безопасности на startPos
, все, что вам нужно сделать, это
char *substr(const char *inpStr, char *outStr, size_t startPos, size_t strLen) {
strncpy(outStr, inpStr + startPos, strLen);
outStr[strLen] = '\0';
return outStr;
}
Как ни странно, в вашем коде strncpy
неправильно используется точно так же. Кроме того, многие из ваших проверок безопасности являются прямым следствием того, что вы выбрали тип со знаком (int
) для представления индексов, тогда как правильный тип будет беззнаковым (size_t
).