Текущий архив: 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.55 MB
Время: 0.038 c