Идиоматический способ сделать это в C состоит в том, чтобы иметь два указателя, источник и назначение, и обрабатывать каждый символ индивидуально: например,
#include <ctype.h>
void reformat_string(char *src, char *dst) {
for (; *src; ++src)
if (!ispunct((unsigned char) *src))
*dst++ = tolower((unsigned char) *src);
*dst = 0;
}
src и dst могут быть одной строкой, так какпункт назначения никогда не будет больше исходного.
Хотя это заманчиво, избегайте вызова tolower(*src++)
, поскольку tolower может быть реализован как макрос.
Избегайте решений, которые ищут заменяемые символы (используя strchrили аналогичные), они превратят линейный алгоритм в геометрический.