Главная страница
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 не возникает, но всё равно как то непринято лезть "туда" за границы :)


 
Empleado ©   (2004-10-26 11:26) [41]

Спасибо всем


 
clickmaker ©   (2004-10-26 11:35) [42]


>  [40] VID ©   (25.10.04 19:41)

Ну так для этого и есть опция $B или флажок complete boolean eval. Кстати, по умолчанию он сброшен, так что паскаль ведет себя так же, как и си


 
}|{yk ©   (2004-10-26 11:58) [43]

Посмотрел. Нужно отнимать 32.


 
VID ©   (2004-10-26 12:04) [44]

wicked, clickmaker спасибо что просветили :)



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

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

Наверх




Память: 0.57 MB
Время: 0.03 c
8-1092063407
Сергей Плоткин
2004-08-09 18:56
2004.11.14
Свойства мультимедийных файлов (wav, mp3, avi)


1-1098867355
_Сергей_
2004-10-27 12:55
2004.11.14
Дизайнер форм


1-1099130123
Artemiy2004
2004-10-30 13:55
2004.11.14
Как скопировать небольшую часть картинки в новый битмап?


10-1058336312
abc
2003-07-16 10:18
2004.11.14
как организовать обратную связь в DCOM? т.е от сервера к клиенту


3-1098052285
Dimchik
2004-10-18 02:31
2004.11.14
Как получить metadata