SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 12/11/2016, 06:04 PM   #1
Johhnyllll
Huge Clucker
 
Johhnyllll's Avatar
 
Join Date: Sep 2014
Posts: 230
Reputation: 8
Question tolower

Здравствуйте, есть вот такая функция:
PHP Code:
stock strtolower(source[]) 

    for(new 
istrlen(source); i++) switch(source[i]) { 
        case 
168source[i] = 184
        case 
192..223source[i] = (source[i] + 32); 
        default: 
source[i] = tolower(source[i]); 
    } 

Для тех кто не понял tolower делает все буквы в маленьком реестре, тоесть:
Вводим: ААААААААААААббббббббббббб
Выдаст: ааааааааааааааббббббббббббб

Мне нужен что-бы первая буква была с большим реестре, а остальные были маленькими, тоесть:
Вводим: ААААААААААААББББББББББББ
Выдаст: Ааааааааааааааббббббббббббб

Подобная функция есть в PHP, а именно ucfirst.
Можно ли как-то осуществить задуманное?
__________________
Мои проекты: GitHub
Johhnyllll is offline   Reply With Quote
Old 12/11/2016, 06:26 PM   #2
VVWVV
Big Clucker
 
Join Date: Jun 2015
Posts: 144
Reputation: 70
Default Re: tolower

Да. Вот:
Code:
stock
	ucfirst(string[])
{
	string[0] = toupper(string[0]);
	const dist = 'A' - 'a';
	for(new i = 1, len = strlen(string), c; i < len; ++i)
	{
		if ('A' <= (c = string[i]) <= 'Z')
			c -= dist;
		string[i] = c;
	}
}
P.S. Я бы ещё сделал поддержку упакованных строк...
VVWVV is offline   Reply With Quote
Old 12/11/2016, 06:27 PM   #3
Johhnyllll
Huge Clucker
 
Johhnyllll's Avatar
 
Join Date: Sep 2014
Posts: 230
Reputation: 8
Default Re: tolower

Quote:
Originally Posted by VVWVV View Post
Да. Вот:
Code:
stock
	ucfirst(string[])
{
	string[0] = toupper(string[0]);
	const dist = 'A' - 'a';
	for(new i = 1, len = strlen(string), c; i < len; ++i)
	{
		if ('A' <= (c = string[i]) <= 'Z')
			c -= dist;
		string[i] = c;
	}
}
P.S. Я бы ещё сделал поддержку упакованных строк...
В каком смысле? Я о таком не слышал... Можете рассказать по подробнее?
//upd
Твоя функция делает из маленького реестра и в большую, т.е:
Вводим: aaaaaaaaaabbbbbbbbbbb
Получится: Aaaaaaaaaabbbbbbbbbbb
Мне же нужна функция каторая не зависимо от реестра работает так:
Вводим: DDDDDDDDFFFFFFFFF или dddddddddffffffffff
Мы получим на выходе: Dddddddddffffffffff
__________________
Мои проекты: GitHub
Johhnyllll is offline   Reply With Quote
Old 12/11/2016, 06:41 PM   #4
VVWVV
Big Clucker
 
Join Date: Jun 2015
Posts: 144
Reputation: 70
Default Re: tolower

Quote:
Originally Posted by Johhnyllll View Post
В каком смысле? Я о таком не слышал... Можете рассказать по подробнее?
В Pawn существует несколько типов хранения строк. Вы, наверное, знаете, что pawn хранит все символы строки как отдельные символы, т.е. в отдельных ячейках. Это не очень экономно. Экономнее использовать упакованные строки, которые по специальному алгоритму упаковывают четыре символа в одну ячейку. Но следует помнить, что не все функции SA-MP поддерживают их.

printf, format.

Это всего лишь оптимизация памяти, а не скорости, поэтому это на ваше усмотрение, использовать или нет.

UPD:
VVWVV is offline   Reply With Quote
Old 12/11/2016, 07:59 PM   #5
Johhnyllll
Huge Clucker
 
Johhnyllll's Avatar
 
Join Date: Sep 2014
Posts: 230
Reputation: 8
Default Re: tolower

Спасибо
__________________
Мои проекты: GitHub
Johhnyllll is offline   Reply With Quote
Old 13/11/2016, 05:35 AM   #6
OKStyle
High-roller
 
OKStyle's Avatar
 
Join Date: May 2008
Location: Russia, Orenburg Money: GTA$ 999,999,999
Posts: 3,118
Reputation: 137
Default Re: tolower

Просто сделай цикл не с i, а с i = 1
__________________
O.K.Style™ Laboratory
Kalcor: "... it's makes the game look like it's not GTA. This mod is called San Andreas Multiplayer. It's not a custom game engine which you can script..."
OKStyle is online now   Reply With Quote
Old 13/11/2016, 05:57 AM   #7
ZiGGi
Banned
 
Join Date: Sep 2008
Location: Russia
Posts: 1,447
Reputation: 356
Default Re: tolower

Quote:
Originally Posted by VVWVV View Post
Да. Вот:
Code:
stock
	ucfirst(string[])
{
	string[0] = toupper(string[0]);
	const dist = 'A' - 'a';
	for(new i = 1, len = strlen(string), c; i < len; ++i)
	{
		if ('A' <= (c = string[i]) <= 'Z')
			c -= dist;
		string[i] = c;
	}
}
P.S. Я бы ещё сделал поддержку упакованных строк...
Что-то ты лишнего "наоптимизировал", так будет гораздо меньше действий:
PHP Code:
stock
    ucfirst
(string[])
{
    
string[0] = toupper(string[0]);
    const 
dist 'A' 'a';
    for (new 
1len strlen(string), clen; ++i)
    {
        if (
'A' <= string[i] <= 'Z')
            
string[i] -= dist;
    }

Те же два обращения к массиву, но лишь одно вычитание. Вместо двух присвоений и одного вычитания.
ZiGGi is offline   Reply With Quote
Old 13/11/2016, 10:07 AM   #8
Richard_Gere
Huge Clucker
 
Richard_Gere's Avatar
 
Join Date: Aug 2010
Posts: 230
Reputation: 5
Default Re: tolower

Почему бы не сделать просто так?
PHP Code:
stock strtolower(source[], len sizeof(source))
{
    
source[0] = toupper(source[0]);
    for(new 
len; --!= 0;) source[i] = tolower(source[i]);

__________________
Sorry for my bad english
Richard_Gere is offline   Reply With Quote
Old 13/11/2016, 10:14 AM   #9
Johhnyllll
Huge Clucker
 
Johhnyllll's Avatar
 
Join Date: Sep 2014
Posts: 230
Reputation: 8
Thumbs up Re: tolower

Quote:
Originally Posted by ZiGGi View Post
Что-то ты лишнего "наоптимизировал", так будет гораздо меньше действий:
PHP Code:
stock
    ucfirst
(string[])
{
    
string[0] = toupper(string[0]);
    const 
dist 'A' 'a';
    for (new 
1len strlen(string), clen; ++i)
    {
        if (
'A' <= string[i] <= 'Z')
            
string[i] -= dist;
    }

Те же два обращения к массиву, но лишь одно вычитание. Вместо двух присвоений и одного вычитания.
Спасибо, помогло.
__________________
Мои проекты: GitHub
Johhnyllll is offline   Reply With Quote
Old 13/11/2016, 11:21 AM   #10
ZiGGi
Banned
 
Join Date: Sep 2008
Location: Russia
Posts: 1,447
Reputation: 356
Default Re: tolower

Quote:
Originally Posted by Richard_Gere View Post
Почему бы не сделать просто так?
PHP Code:
stock strtolower(source[], len sizeof(source))
{
    
source[0] = toupper(source[0]);
    for(new 
len; --!= 0;) source[i] = tolower(source[i]);

Потому что:
- tolower будет медленнее вычитания
- sizeof возвращает размер массива, а не длину строки
ZiGGi is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Lower Case (tolower) Help alishvasis Scripting Help 5 23/02/2014 12:21 AM
tolower output Dotayuri Scripting Help 12 14/02/2013 08:03 PM
tolower from Y_LESS is buggy? Bubelbub Scripting Help 2 15/07/2012 08:27 PM


All times are GMT. The time now is 06:20 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.