- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
int cutNCountLt3(char *in, char *out, long min) {
int lt3 = 0;
char *i = in, *j = in, *k = out;
while (*j && *i) {
j = i;
while (*j != ' ' && *j)
*k++ = *j++;
*k++ = *j;
int len = j - i;
lt3 += len < 3;
if (len < min)
*(k -= len + 1) = '\0';
i = j + 1;
}
return lt3;
}
Нафига? Можно же просто k -= len + 1, а нолик один раз в конце подклеить перед самым возвратом.
Однако есть одно исключение, которое портит малину: в случае если in и out одинакового размера (например in == out), и ниодного слова не было вырезано, то произойдёт запись за пределом выделенной памяти. безопасно.
Если последнее слово скопировалось вместе с пробелом "foo ", то k указывает за пробел, k>out, k[-1] = '\0', пробел затирается ноликом. Ок.
Если последнее слово скопировалось вместе с ноликом "foo\0", то k указывает на нолик, k>out, k[-1] = '\0', ничего не менется. Ок.
Вроде проблем нету...
У меня выдало:
Конечо можно сказать пользователю, чтоб аллоцировал буфер на один больше исходной строки