Я бы сказал, верните NULL
, если ввод неправильный, а не malloc()
ed пустая строка. Таким образом, вы можете проверить, не сработала ли функция или нет с помощью if(p)
вместо if(*p == 0)
.
Кроме того, я думаю, что ваша функция теряет память, потому что emptyString
только free()
d в одном условии. Вы должны убедиться, что вы free()
безоговорочно, то есть прямо перед return
.
Что касается вашего комментария к strncpy()
, не завершающего строку NUL (что верно), если вы используете calloc()
для выделения строки вместо malloc()
, это не будет проблемой, если вы выделите одну байт больше, чем вы копируете, поскольку calloc()
автоматически устанавливает все значения (включая, в данном случае, конец) на 0.
Я бы дал вам больше заметок, но я ненавижу читать код CamelCase. Не то чтобы в этом что-то было не так.
РЕДАКТИРОВАТЬ: Что касается ваших обновлений:
Имейте в виду, что стандарт C определяет sizeof(char)
как 1 независимо от вашей системы. Если вы используете компьютер, который использует 9 битов в байте (не дай бог), sizeof(char)
все равно будет 1. Не то, чтобы было что-то не так с высказыванием sizeof(char)
- это ясно показывает ваше намерение и обеспечивает симметрию с вызовами до calloc()
или malloc()
для других типов. Но sizeof(int)
действительно полезен (int
s могут быть разных размеров на 16- и 32- и этих новомодных 64-битных компьютерах). Чем больше ты знаешь.
Я также хотел бы повторить, что согласованность с большинством других кодов C означает возвращение NULL
при ошибке, а не ""
. Я знаю, что многие функции (например, strcmp()
), вероятно, будут делать плохие вещи, если вы передадите им NULL - этого следовало ожидать. Но стандартная библиотека C (и многие другие API C) используют подход: «Ответственность за проверку NULL
лежит на вызывающем абоненте, а не на функции, если он / она его / ее присматривает, если он (и) этого не делает». Если вы хотите сделать это по-другому, это круто, но это идет вразрез с одной из сильных тенденций в дизайне интерфейса C.
Кроме того, я бы использовал strncpy()
(или memcpy()
) вместо strncat()
. Использование strncat()
(и strcat()
) скрывает ваши намерения - это заставляет того, кто смотрит на ваш код, думать, что вы хотите добавить к концу строки (что вы и делаете, потому что после calloc()
конец - это начало), когда то, что вы хотите сделать, это установить строку. strncat()
выглядит так, как будто вы добавляете строку, в то время как strcpy()
(или другая процедура копирования) делает ее более похожей на ваше намерение. Следующие три строки все делают одно и то же в этом контексте - выберите ту, которая, по вашему мнению, выглядит лучше:
strncat(returnString, text + nStartingPos, nRun);
strncpy(returnString, text + nStartingPos, nRun);
memcpy(returnString, text + nStartingPos, nRun);
Плюс, strncpy()
и memcpy()
, вероятно, будут (крошечные) немного быстрее / эффективнее, чем strncat()
.
text + nStartingPos
- это то же самое, что и nStartingPos + text
- я бы поставил char *
первым, так как я думаю, что это более понятно, но в каком бы порядке вы ни ставили их, зависит от вас. Кроме того, круглые скобки вокруг них не нужны (но хороши), так как +
имеет более высокий приоритет, чем ,
.
РЕДАКТИРОВАТЬ 2: три строки кода не делают то же самое, но в этом контексте они все будут давать один и тот же результат. Спасибо, что поймали меня на этом.