- 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;
}
Elvenfighter 03.08.2015 02:32 # 0
Elvenfighter 03.08.2015 02:49 # 0
Elvenfighter 03.08.2015 02:52 # 0
bormand 03.08.2015 06:49 # 0
Нафига? Можно же просто k -= len + 1, а нолик один раз в конце подклеить перед самым возвратом.
Elvenfighter 03.08.2015 11:12 # 0
Однако есть одно исключение, которое портит малину: в случае если in и out одинакового размера (например in == out), и ниодного слова не было вырезано, то произойдёт запись за пределом выделенной памяти. безопасно.
bormand 03.08.2015 11:18 # 0
bormand 03.08.2015 11:23 # +1
Если последнее слово скопировалось вместе с пробелом "foo ", то k указывает за пробел, k>out, k[-1] = '\0', пробел затирается ноликом. Ок.
Если последнее слово скопировалось вместе с ноликом "foo\0", то k указывает на нолик, k>out, k[-1] = '\0', ничего не менется. Ок.
Вроде проблем нету...
Elvenfighter 03.08.2015 19:34 # 0
У меня выдало:
Конечо можно сказать пользователю, чтоб аллоцировал буфер на один больше исходной строки
bormand 03.08.2015 19:36 # 0
Elvenfighter 03.08.2015 19:57 # 0
guest 14.11.2015 15:31 # +1
1024-- 14.11.2015 15:34 # +1
guest 14.11.2015 18:44 # 0
guest 14.11.2015 21:48 # 0
naxoM 14.11.2015 23:21 # 0
guest 20.11.2015 07:35 # 0
guest 20.11.2015 15:08 # 0
guest 24.11.2015 09:43 # 0
Elvenfighter 03.08.2015 19:48 # 0
guest 04.08.2015 12:47 # +2
Elvenfighter 04.08.2015 14:40 # +2
guest 14.11.2015 14:44 # 0
guest 20.11.2015 07:34 # 0
guest 20.11.2015 15:08 # 0
guest 24.11.2015 09:42 # 0