- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
#define MIN(i1, i2) (i1 < i2 ? i1 : i2)
int mr_word_compare(const char* r1, int s1, const char* r2, int s2)
{
int l1 = strchr(r1, ' ') - r1;
int l2 = strchr(r2, ' ') - r2;
return strncmp(r1, r2, MIN(l1, l2));
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+139
#define MIN(i1, i2) (i1 < i2 ? i1 : i2)
int mr_word_compare(const char* r1, int s1, const char* r2, int s2)
{
int l1 = strchr(r1, ' ') - r1;
int l2 = strchr(r2, ' ') - r2;
return strncmp(r1, r2, MIN(l1, l2));
}
пердложенный вариант исправления #4093 (http://govnokod.ru/4093)
degeron 25.08.2010 09:36 # +2
Altravert 25.08.2010 10:13 # 0
выходит затратнее, чем
Оно же там всё равно то же почти делает, а ты еще потом вычитаешь адрес. Хотя может я не прав. Но это всё мелочи.
Это уже не говнокод. А вот хотел бы я посмотреть, что человек сделает, когда разделителем кроме пробела могут быть знаки пунктуации, переводы строки и т.п.
Setry 25.08.2010 11:07 # −2
1) здесь нет проверки, что если пробела вообще нет в строке
2) используя цикл можно вести поиск не до пробела, а скажем примерно так:
#define is_separator(x) x == ' ' || x == ','
...
if (is_separator(*p))break;
а функция целиком будет выглядеть примерно так:
#define is_separator(x) x == ' ' || x == ','
int foo (char *str1, char *str2)
{
char *s1 = str1, *s2 = str2;
int len = 0;
while (*s1 && *s2)
{
if (is_separator(*s1++))break;
if (is_separotor(*s2++))break;
++len;
}
return strncmp (str1, str2, len);
}
ну и макрос MIN это просто жесть)
нельзя такие использовать
Altravert 25.08.2010 11:14 # 0
Kornew 25.08.2010 12:00 # 0
или так, в более универсальном виде (с набором разделителей в параметре spr):
накой хрен вам сдалась та строковая функция, если вы на прямую работаете со строкой?: вам лишние циклы по приколу?...
Kornew 25.08.2010 12:10 # 0
хотя там по-ходу много фейлов: сейчас уточним =Ъ
Kornew 25.08.2010 12:24 # +1
с фиксированными разделителями
с набором разделителями в параметре:
Govnoeb 25.08.2010 18:44 # +1
тем более, return можно записать проще:
мои соболезнования
Kornew 25.08.2010 19:26 # 0
необходима заплатка..
кстати, на счёт ретурна тоже интересно, сразу не додумал =(
Govnoeb 25.08.2010 23:13 # +1
лечится перестановкой условий:
Kornew 26.08.2010 01:16 # 0
Kornew 25.08.2010 19:39 # 0
foo(NULL, NULL, NULL);
xD
Altravert 25.08.2010 12:47 # 0
UPD: Пизжу, вроде ты прав)) А в первом варианте это был пиздееец)
Kornew 25.08.2010 13:10 # 0
Govnoeb 25.08.2010 14:19 # 0
неси зачетку
Setry 25.08.2010 19:34 # 0
причем я макрос MIN покритиковал и сам наступил на те же грабли=)
Govnoeb 25.08.2010 14:49 # −1
мой вариант:
Altravert 25.08.2010 15:24 # +1
То есть, нет, если строки равны то ты возвращаешь разницу длины строк?
Govnoeb 25.08.2010 18:57 # 0
Altravert 25.08.2010 19:15 # 0
Проверь. Длина не при чем.
Govnoeb 25.08.2010 23:18 # 0
проверь:
так из-за MIN()
Kornew 25.08.2010 16:46 # +1
кстати, если строки не имеют символов: '\0' и delim, то будет красотища неописуемая
и еще 1 цикл для сравнения участка строки...
гламурно, чо =)
----------------------
как выше было показано:
это делается более оптимальным способом (1 проход по строкам) и в зависимости от функциональности:
- 1 проверка на символ-разделитель
- или 1 цикл проверок на набор разделителей
Govnoeb 25.08.2010 18:58 # 0
сразу после входа в функцию надо добавить