- 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)
выходит затратнее, чем
Оно же там всё равно то же почти делает, а ты еще потом вычитаешь адрес. Хотя может я не прав. Но это всё мелочи.
Это уже не говнокод. А вот хотел бы я посмотреть, что человек сделает, когда разделителем кроме пробела могут быть знаки пунктуации, переводы строки и т.п.
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 это просто жесть)
нельзя такие использовать
или так, в более универсальном виде (с набором разделителей в параметре spr):
накой хрен вам сдалась та строковая функция, если вы на прямую работаете со строкой?: вам лишние циклы по приколу?...
хотя там по-ходу много фейлов: сейчас уточним =Ъ
с фиксированными разделителями
с набором разделителями в параметре:
тем более, return можно записать проще:
мои соболезнования
необходима заплатка..
кстати, на счёт ретурна тоже интересно, сразу не додумал =(
лечится перестановкой условий:
foo(NULL, NULL, NULL);
xD
UPD: Пизжу, вроде ты прав)) А в первом варианте это был пиздееец)
неси зачетку
причем я макрос MIN покритиковал и сам наступил на те же грабли=)
мой вариант:
То есть, нет, если строки равны то ты возвращаешь разницу длины строк?
Проверь. Длина не при чем.
проверь:
так из-за MIN()
кстати, если строки не имеют символов: '\0' и delim, то будет красотища неописуемая
и еще 1 цикл для сравнения участка строки...
гламурно, чо =)
----------------------
как выше было показано:
это делается более оптимальным способом (1 проход по строкам) и в зависимости от функциональности:
- 1 проверка на символ-разделитель
- или 1 цикл проверок на набор разделителей
сразу после входа в функцию надо добавить