IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> lower , Си, неясный код
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день!
вот есть функция, которая большие буквы привращает в маленькии, но как она это делает?
#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, то возвращаем с(о_О) в противном случае что-то другое... однако, утверждение неверно в корне, поскольку функция "понижает", а не "повышает" буквы...

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






А на что тебе ЭТА функция, можно полюбопытствовать, если есть tolower() ?

А по поводу "как работает" - то p содержит адрес БОЛЬШОЙ буквы, если от него отнять адрес начала строки Uppercase - то получишь смещение буквы в строке... Но ведь и МАЛЕНЬКАЯ буква находится во второй строке с тем же смещением, поэтому к началу Lowercase прибавляем его - получаем из большой буквы маленькую...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 30.12.2007 22:17) *
А на что тебе ЭТА функция, можно полюбопытствовать, если есть tolower() ?
учебный пример...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






См. выше, я написал...

Добавлено через 5 мин.
Кстати, вопрос на засыпку: в чем смысл использования конструкции NULL == (что-то) вместо (что-то) == NULL, знаешь? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


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

Сообщение отредактировано: compiler -


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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), но вот работать будет заведомо неверно...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(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 с возращаемым значением, а не переменной, поэтому присвоения сдесь быть не может...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
присвоения сдесь быть не может
Вот в том фрагменте, который я привел - сравнения как раз никакого нет, есть только присвоения... И если ты забудешь (то, что ты не можешь сделать присвоение вместо сравнения сознательно - это понятно) один знак равенства (что я намеренно и сделал) - то потом долго будешь искать ошибку...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 31.12.2007 14:05) *
Вот в том фрагменте ... то потом долго будешь искать ошибку...
пару дней наазад я час точно убил так:) (допустил ошибку в if)... Но в твоем фрагменте ошибку замечает компилятор, а налогично в выражение (2==3)=1; возникает (некорректная левая часть в присваивании)... Но я понял общую суть...


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 18:02
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name