Помощь - Поиск - Пользователи - Календарь
Полная версия: lower , Си
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
compiler
Добрый день!
вот есть функция, которая большие буквы привращает в маленькии, но как она это делает?
#include <string.h>
int lower(int c)
{
char *Uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *Lowercase = "abcdefghijklmnopqrstuvwxyz";
char *p = NULL;

return NULL == (p = strchr(Uppercase, c)) ? c : *(Lowercase + (p - Uppercase));
}

заранее благодарен.

итак strchr(Uppercase, c) возвращает указатель на первое вхождение или NULL. если не NULL, то возвращаем с(о_О) в противном случае что-то другое... однако, утверждение неверно в корне, поскольку функция "понижает", а не "повышает" буквы...
volvo
А на что тебе ЭТА функция, можно полюбопытствовать, если есть tolower() ?

А по поводу "как работает" - то p содержит адрес БОЛЬШОЙ буквы, если от него отнять адрес начала строки Uppercase - то получишь смещение буквы в строке... Но ведь и МАЛЕНЬКАЯ буква находится во второй строке с тем же смещением, поэтому к началу Lowercase прибавляем его - получаем из большой буквы маленькую...
compiler
Цитата(volvo @ 30.12.2007 22:17) *
А на что тебе ЭТА функция, можно полюбопытствовать, если есть tolower() ?
учебный пример...
volvo
См. выше, я написал...

Добавлено через 5 мин.
Кстати, вопрос на засыпку: в чем смысл использования конструкции NULL == (что-то) вместо (что-то) == NULL, знаешь? smile.gif
compiler
Цитата(volvo @ 30.12.2007 22:22) *
Кстати, вопрос на засыпку: в чем смысл использования конструкции NULL == (что-то) вместо (что-то) == NULL, знаешь? smile.gif
нет, возможно в данной программе нужно лишиться типа? что б потом вызывающая функция сама думала что с этим делать...а == NULL создание "пустого" указателя...
volvo
no1.gif Ничего ты не лишишься... Просто некоторые (я не отношусь к их числу, и эту конструкцию NULL==(что-то) не использую) считают, что она поможет отыскать ошибку, если будет пропущен один знак равенства:

return NULL = (p = strchr(Uppercase, c)) ? c : *(Lowercase + (p - Uppercase));

компилироваться не станет, в то время как
return ((p = strchr(Uppercase, c)) = NULL) ? c : *(Lowercase + (p - Uppercase));

откомпилируется даже без Warning-ов (в частности на GCC), но вот работать будет заведомо неверно...
compiler
Цитата(volvo @ 30.12.2007 22:43) *
no1.gif Ничего ты не лишишься... Просто некоторые (я не отношусь к их числу, и эту конструкцию NULL==(что-то) не использую) считают, что она поможет отыскать ошибку, если будет пропущен один знак равенства:
да, я это встречал. писать не (i==5), а (5==i) , но все забыл... Спасибо что напомнил!

Цитата(volvo @ 30.12.2007 22:43) *
...в то время как
return ((p = strchr(Uppercase, c)) = NULL) ? c : *(Lowercase + (p - Uppercase));
откомпилируется даже без Warning-ов (в частности на GCC), но вот работать будет заведомо неверно...
хм.. ну тут помоему немножко другое... мы ведь сравниваем NULL с возращаемым значением, а не переменной, поэтому присвоения сдесь быть не может...
volvo
Цитата
присвоения сдесь быть не может
Вот в том фрагменте, который я привел - сравнения как раз никакого нет, есть только присвоения... И если ты забудешь (то, что ты не можешь сделать присвоение вместо сравнения сознательно - это понятно) один знак равенства (что я намеренно и сделал) - то потом долго будешь искать ошибку...
compiler
Цитата(volvo @ 31.12.2007 14:05) *
Вот в том фрагменте ... то потом долго будешь искать ошибку...
пару дней наазад я час точно убил так:) (допустил ошибку в if)... Но в твоем фрагменте ошибку замечает компилятор, а налогично в выражение (2==3)=1; возникает (некорректная левая часть в присваивании)... Но я понял общую суть...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.