Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Есть ли знатоки C (не C++)   Найти похожие ветки 

 
Empleado ©   (2004-10-25 17:47) [0]

Необходимо в простой строке (ex."aa ccc ggg eeee ss afjfj ...") наикротчайшим (!) кодом заменить в каждом слове первую букву на заглавную
Спасибо откликнувшимся


 
wicked ©   (2004-10-25 17:49) [1]

а при чем здесь си?..... специальных библиотек там нету, всё так же - перебираем, ищем пробелы, заменяем....


 
}|{yk ©   (2004-10-25 17:54) [2]

Если String to
void Func
{
String str;
for (int i=0;i<str.Length()-1;i++)
  if (str[i]==" ")
   (int)str[i+1]++;
}


 
}|{yk ©   (2004-10-25 17:56) [3]

а, не увидел что С. но принцип тот же, просто используй strcmp


 
clickmaker ©   (2004-10-25 17:57) [4]

char s[1000];
int i;

strcpy(c, "aa ccc ggg eeee ss afjfj");
for (i = 0; i < strlen(s); i++)
{
if (i == 0) || (s[i-1] == " ") s[i] = toupper(s[i]);
}


 
вразлет ©   (2004-10-25 18:00) [5]

if (str[i]==" ")
  (int)str[i+1]++;


Гы


 
VID ©   (2004-10-25 18:02) [6]

clickmaker ©   (25.10.04 17:57) [4]
мдаа, а на дельфи такой фрагмент
if (i == 0) || (s[i-1] == " ") s[i] = toupper(s[i]);
не прошёл бы...


 
DiamondShark ©   (2004-10-25 18:03) [7]


> for (i = 0; i < strlen(s); i++)

А этому нафига в цикле крутиться?


 
ха   (2004-10-25 18:06) [8]

А этому нафига в цикле крутиться?

А что тебя смущает?


 
VID ©   (2004-10-25 18:07) [9]

}|{yk ©   (25.10.04 17:54) [2]
Твой код оценён как источник AV, а также пропуска первого символа :)
(если например первый символ не пробел)


 
wicked ©   (2004-10-25 18:08) [10]


> if (i == 0) || (s[i-1] == " ") s[i] = toupper(s[i]);

if (i == 0 || s[i-1] == " ") s[i] = toupper(s[i]);
а то не скомпилируется.....


 
clickmaker ©   (2004-10-25 18:08) [11]


> [6] VID ©   (25.10.04 18:02)
> clickmaker ©   (25.10.04 17:57) [4]
> мдаа, а на дельфи такой фрагмент
> if (i == 0) || (s[i-1] == " ") s[i] = toupper(s[i]);
> не прошёл бы...

Логично :) Языки-то разные


> [7] DiamondShark ©   (25.10.04 18:03)
>
> > for (i = 0; i < strlen(s); i++)
>
> А этому нафига в цикле крутиться?

За оптимизацию деньги платят :))


 
ха   (2004-10-25 18:10) [12]

if (i == 0 || s[i-1] == " ") s[i] = toupper(s[i]);
а то не скомпилируется.....


непрально
if ((i == 0 )|| (s[i-1] == " ")) s[i] = toupper(s[i]);


 
}|{yk ©   (2004-10-25 18:10) [13]

А AV где?


 
wicked ©   (2004-10-25 18:10) [14]

> ха   (25.10.04 18:06) [8]
а это - элементарная культура кодинга - выносить инварианты.... тем более, что for в си - это совсем не for в паскале, а скорее продвинутый while и условие это (i < strlen(s)) будет проверяться каждую итерацию.....


 
DiamondShark ©   (2004-10-25 18:11) [15]


> ха   (25.10.04 18:06) [8]
> А что тебя смущает?

Вспомни, как работает strlen.


 
VID ©   (2004-10-25 18:11) [16]

}|{yk ©   (25.10.04 17:54) [2]
нету AV. Соврал я... Каюсь :)


 
ха   (2004-10-25 18:11) [17]

wicked ©

учите матчасть, уважаемый)


 
wicked ©   (2004-10-25 18:11) [18]

> ха [12]
а давай, нас компилятор рассудит?....


 
ха   (2004-10-25 18:12) [19]

wicked ©

Давай)


 
ха   (2004-10-25 18:13) [20]

[15] DiamondShark ©   (25.10.04 18:11)

Оч просто, длина строки без нультерминального символа, а что, что -то не так?


 
wicked ©   (2004-10-25 18:14) [21]

> ха   (25.10.04 18:12) [19]
вот набери пример и скомпилируй....
мне нет нужды это делать - я уже 2 года на паскале не писал....


 
Игорь Шевченко ©   (2004-10-25 18:14) [22]

strtok ?


 
вразлет ©   (2004-10-25 18:15) [23]

(int)str[i+1]++;

А сия конструкция случаем не заменяет буковку а на буковку б?


 
VID ©   (2004-10-25 18:15) [24]

clickmaker ©   (25.10.04 18:08) [11]
Логично :) Языки-то разные


я вообще то не о синтаксисе говорю, а о методике проверки условий if.
Дельфи проверяет весь if до конца (и поэтому в соотв. с твоим кодом может выдать AV при s[i-1]==" " при первой итерации (i=0)), а в C проверка то проводится до первого TRUE.


 
}|{yk ©   (2004-10-25 18:15) [25]

Да, надо вспоминать С++ (год уж как не программил). о цикле
удобно asm сгенеренный посмотреть


 
wicked ©   (2004-10-25 18:16) [26]

> Игорь Шевченко ©   (25.10.04 18:14) [22]
беда в том, что strtok вставляет NULL-символы после найденных лексем.... посему правильней будет код clickmaker [4] с поправками и дополнениями....


 
}|{yk ©   (2004-10-25 18:17) [27]

Ну это нужно смотреть таблицу кодировок. Может надо что-то отнимать/прибавлять, уже не помню


 
DiamondShark ©   (2004-10-25 18:18) [28]


> ха   (25.10.04 18:13) [20]
> Оч просто, длина строки без нультерминального символа, а
> что, что -то не так?

Как именно считается эта длина?
И сколько раз будет вычисленно выражение i < strlen(s)?
А зависит ли значение этого выражения от тела цикла?


 
wicked ©   (2004-10-25 18:19) [29]

> VID [24]

> Дельфи проверяет весь if до конца (и поэтому в соотв. с
> твоим кодом может выдать AV при s[i-1]==" " при первой итерации
> (i=0))

а это зависит от значения флажка $B...
а способ в C проверка то проводится до первого TRUE в реальности позволяет сэкономить кучу места и времени....


 
vecna ©   (2004-10-25 18:20) [30]

Наскока я помню времена ДОСа
заглавная буква из маленькой получалась примерно так%

UpChar = LowChar || cSomeByte;

Только вот, чему равен SomeByte не помню, но идея такая


 
Игорь Шевченко ©   (2004-10-25 18:23) [31]

wicked ©   (25.10.04 18:16) [26]


> беда в том, что strtok вставляет NULL-символы после найденных
> лексем....


Да, точно.


 
clickmaker ©   (2004-10-25 18:24) [32]


> [24] VID ©   (25.10.04 18:15)
> clickmaker ©   (25.10.04 18:08) [11]
> Логично :) Языки-то разные
>
> я вообще то не о синтаксисе говорю, а о методике проверки
> условий if.
> Дельфи проверяет весь if до конца

А почему тогда такой код не выкидывает никаких AV?

var
 s: array[0..1000] of char;
 i: integer;

 lstrcpy(s, "aa ccc ggg eeee ss afjfj");
 for i := 0 to lstrlen(s) do begin
   if (i = 0) or (s[i] = " ") then
     s[i+1] := AnsiUpperCase(StringOfChar(s[i+1], 1))[1];
 end;


 
wicked ©   (2004-10-25 18:25) [33]

> vecna ©   (25.10.04 18:20) [30]
почти так....
LowChar = UpChar | 0x20
UpChar = LowChar & (~0x20)
IncCaseChar = Char ^ 0x20

но это только для ASCII/ANSI.... поэтому правильней было бы использовать что то типа IsUpper/IsLower и ToUpper/ToLower...


 
clickmaker ©   (2004-10-25 18:26) [34]

Вернее, такой

var
 s: array[0..1000] of char;
 i: integer;

 lstrcpy(s, "aa ccc ggg eeee ss afjfj");
 for i := 0 to lstrlen(s) do begin
   if (i = 0) or (s[i-1] = " ") then
     s[i] := AnsiUpperCase(StringOfChar(s[i], 1))[1];
 end;


 
ха   (2004-10-25 18:26) [35]

wicked ©, DiamondShark ©

Признаю неправоту


 
vecna ©   (2004-10-25 18:29) [36]

2wicked
Точно! Спасибо...
Зато какая фишка! =)


 
DiamondShark ©   (2004-10-25 18:30) [37]

void Capitalize(char* str);
{
 int fWord = 1;
 if (str)
   for (;str*;str++)
   {
     if (fWord) str* = UpperChar(str*);
     fWord = (str* == " ");
   }
}


 
wicked ©   (2004-10-25 18:32) [38]

> DiamondShark ©   (25.10.04 18:30) [37]

> str*

*str


 
DiamondShark ©   (2004-10-25 18:42) [39]

Главное, что понятно ;)


 
VID ©   (2004-10-25 19:41) [40]

clickmaker ©   (25.10.04 18:26) [34]
мда, ни в твоём примере ни  в случае если
s:string = "123";I:integer=-1; showmessage(s[i]);
AV не возникает, но всё равно как то непринято лезть "туда" за границы :)



Страницы: 1 2 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.038 c
1-1099393717
Pentium133
2004-11-02 14:08
2004.11.14
Не вызывается Change! Что делать?


1-1098940211
Font
2004-10-28 09:10
2004.11.14
Unicode и VCL


14-1098561110
@BraIN
2004-10-23 23:51
2004.11.14
Чем Paste отличается от Insert?


1-1099325326
ser_ega
2004-11-01 19:08
2004.11.14
CheckListBox


1-1099285151
Anics
2004-11-01 07:59
2004.11.14
Как отловить действие пользователя "Завершение работы" ?