Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Забытые секреты кодинга №2: строковые операции в C

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Обсуждение статей] >> Забытые секреты кодинга №2: строковые операции в C
Имя
Сообщение << Старые топики   Новые топики >>
Забытые секреты кодинга №2: строковые операции в C - 2007-10-03 12:04:27.386666   
ArtAdmin

Сообщений: 11556
Оценки: 14
Присоединился: 2007-01-17 16:55:01.430000
Обсуждение статьи "Забытые секреты кодинга №2: строковые операции в C"
Post #: 1
Chemiker;&nbsp; e-mail: - 2007-10-03 12:04:27.560000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Сорри конечно, обяснено дальше не куда, но разве тут есть люди не понимающие указателей ???
Post #: 2
kas;&nbsp; e-mail: kas_alexey@mail.ru - 2007-10-03 12:04:27.590000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Нормальная статья! Но в своей группе большинство всеже понимают что такое указатели! Но для того у кого нет той части мозга эта статья не поможет!
Post #: 3
BOLT;&nbsp; e-mail: - 2007-10-03 12:04:27.620000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
"Но я пока не нашел другого работающего способа преобразовать тип (char) в (char*)."
Я целый час смеялся! И ты еще говоришь че-то о нехватке мозгов, отвечающих за указатели!? Да их у тебя НЕТ! Ты когда-нибудь слышал об операторе взятии адреса? Нет? А ты слышал когда-нибудь, что имя массива - это и есть указатель на первый его символ? Нет? А ты слышал когда-нибудь, что в C нет классов и MFC - это библиотека никак не может работать на C? Короче, ребяты, не читайте это дерьмо. Видимо, пацан списал откуда-то и сам не понял что написал!
Теперь понятно, почему все называют журнал Xekep отстоем!
Post #: 4
Петр Каньковски;&nbsp; e-mail: kankowski@narod.ru - 2007-10-03 12:04:27.636666   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
BOLT: "в C нет классов" Да, согласен, нужно было написать C++. Это моя ошибка. "Ты когда-нибудь слышал об операторе взятии адреса?" Если ты возьмешь адрес от char, это будет адрес твоей переменной, а в этом случае нужно передать символ (или байт, если угодно), но передать его как (char*). Надеюсь, понятно :). "имя массива - это и есть указатель на первый его символ". Ну и что? Это адрес m[0], а нам нужен сам m[0], но преобразованный к типу (char*). Прежде чем ругаться, разберись в преобразовании типов.
Post #: 5
ZiV;&nbsp; e-mail: - 2007-10-03 12:04:27.653333   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
мДА, BOLT - ты сначала разберись в том, что паниша написал, а потом выставляй на показ свои знания.
Ты сам себя опозорил, просто смешно.
Парниша - молоток, статья хорошая.
Post #: 6
G-$$;&nbsp; e-mail: g-ss@yandex.ru - 2007-10-03 12:04:27.683333   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Респект) Замечательная статья! Какое-то время назад (вчера уволился))) я подрабатывал преподом по сям, и, когда зашла речь об указателях, кинул им линк на эту статейку. И народ всё понял :) Супер.
Post #: 7
BOLT;&nbsp; e-mail: - 2007-10-03 12:04:27.700000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
2)
"Можно ли в C работать со строками как в Паскале или Бэйсике? То есть можно ли складывать строки плюсом, автоматически выделять под них память и все такое? Да, можно."

Нет нельзя. Ну, тут ты, видимо, перепутал с C++. Но и в C++ тоже нельзя работать со строками как в Pascal´е. Попробуй сложи "я" и "умный" и че будет? А? Вот именно. В C++ есть механизм переопределения операторов в классах. Так в классе CString переопределены операторы +,=,<,> и т.д. Например, функция CString::operator+( char* str ), которая и переопределяет оператор +, создает новый массив и копирует туда данные из объекта и строки ( str ). Утрировано говоря, можно "сложить" объект и строку, объект и объект, но никак НЕЛЬЗЯ "СЛОЖИТЬ" СТРОКИ между собой. Из-за того что ты привел в пример класс CString, а не класс string, входящий в стандартную бибилотеку C++, у меня предположение, что ты не знаешь что такое STL. Короче, ложанулся ты конкретно.

3)
"Как выделить подстроку слева, например, путь к файлу? Подставь нулевой байт в конец подстроки:"
p = strrchr(filename, ´\\´);
*p = ´\0´; // Теперь в filename записан путь к файлу

Ты хоть смотришь, что пишешь? Это же маразм. Кто-нибудь проверьте этот код. Я даже не проверяя могу сказать, что p будет указывать на симвл ´\0´, т.е. строка ничего не будет содержать.
Post #: 8
BOLT;&nbsp; e-mail: - 2007-10-03 12:04:27.700000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Показывал знакомым статью, чтобы посмеятся. Пришлось отвечать.
Ну, ладно давай по порядку:

1)
"Строка в Си - это указатель на символ (char)."

Это еще не строка.

char c = ´a´;
char *c2 = &c;

Разве это строка? Нет? Ну что ж ты так? А?
Строка в C/C++ - это как минимум два символа:
char str[] = "a";
Вот это строка. Символ ´a´ плюс ´\0´ - конец строки. А указатель на символ - это указатель на символ, но никак не строка.
Post #: 9
BOLT;&nbsp; e-mail: - 2007-10-03 12:04:27.713333   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
4)"Кстати, во многом это проблема программистов Microsoft…"

Да? А мне кажется, что это у тебя проблемы. Делается это в два счета:
CharUpperBuff( &m[0], 1 );
CharUpperBuff( &m[2], 2 );

Дальше мне просто надоело. Статья просто отстойная. Ошибка на ошибке.
Post #: 10
vekles;&nbsp; e-mail: - 2007-10-03 12:04:27.730000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Нашедшему хоть один секрет кодинга в этом тексте воздвигну памятник из материала заказчика.
Post #: 11
Петр Каньковски;&nbsp; e-mail: kankowski@narod.ru - 2007-10-03 12:04:27.730000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
To G-$$ и ZiV: Спасибо за добрые слова. Хотя BOLT действительно в чем-то прав: ошибка C/C++ была довольно грубой.
Post #: 12
Петр Каньковски;&nbsp; e-mail: kankowski@narod.ru - 2007-10-03 12:04:27.730000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
2BOLT: "Я даже не проверяя могу сказать, что p будет указывать на символ \0." Правильно, а filename будет содержать путь к файлу, как и было написано в статье. "CharUpperBuff( &m[0], 1 );" Да, можно и так. А можно и через CharUpper(). "Так в классе CString переопределены операторы +,=,<,> и т.д." Хорошо, значит вопрос в том, что мы назовем строкой - указатель на массив символов, заканчивающийся нулевым символом, или же будет считать и объект строкой тоже. Если ты можешь проводить с объектом все операции, которые делаешь со строками в Паскале, почему бы не сказать, что это строка?
Post #: 13
BOLT;&nbsp; e-mail: - 2007-10-03 12:04:27.730000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
2ZiV:
А ты вообще чего квакаешь? Где я опозорился? Приведи хоть один аргумент?
Все, что я написал основывается на фактах. А от таких как ты, только и умеющих пи*деть и ничего кроме этого, меня тошнит.
Post #: 14
NONAME;&nbsp; e-mail: Boba@rambler.ru - 2007-10-03 12:04:27.746666   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Проверка
Post #: 15
ILia;&nbsp; e-mail: veryhot@hotmail.ru - 2007-10-03 12:04:27.776666   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Статья так себе - общие заметки для начинающего программера. Не нашел в ней ничего интересного… =(
Post #: 16
nickname Black;&nbsp; e-mail: blade_antiskin@mail.ru - 2007-10-03 12:04:27.793333   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Не думаю, что "секрктами" можно назвать то, без чего языком Си никто и никогда бы не пользовался. Не претендуя на секрктность могу добавить что массив символов можно объявить с любым целым типом: str = new int. Это имеет смысл, потому что функции чтения из файла возвращают -1, когда достигнут конец файла, а т.к. char - тип беззнаковый, возникает геморрой при проверке этого условия: if(chr==-1)…
Post #: 17
Nelly;&nbsp; e-mail: trishi@ua.fm - 2007-10-03 12:04:27.810000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Статья - супер. Очень помогла. Хотя использовала я её не для того, чтобы научиться работать с указателями, а чтобы разобраться с функциями для работы со строками.
Это единственная ссылка, которая мне реально помогла.
Только вот ещё хотелось бы, если можно, чтобы статью именно про строки и все-все функции для работы с ними сделали. Если можно, конечно!
Post #: 18
nickname Black;&nbsp; e-mail: blade_antiskin@mail.ru - 2007-10-03 12:04:27.810000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
["имя массива - это и есть указатель на первый его символ". Ну и что? Это адрес m[0], а нам нужен сам m[0], но преобразованный к типу (char*). Прежде чем ругаться, разберись в преобразовании типов.]
Минуту, если нам нужен указатель на символ ("преобразовать символ в указатель" ну никак нельзя:-)) не проще ли накодить: char *p; p=m;
Тогда *p будет давать тот самый первый символ, а p (без звезды) - его адес в строковой переменной. Боюсь, Bolt был прав.
Post #: 19
Lori;&nbsp; e-mail: phillip@pisem.net - 2007-10-03 12:04:27.823333   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Thank you!
http://quvmqfuq.com/fbky/cjvi.html | http://yltfetpv.com/cqjz/quvr.html
Post #: 20
RE: Забытые секреты кодинга №2: строковые операции в C - 2007-10-03 12:04:27.840000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
спасибо за статью…
наконецто я решил одно из заданий по контрольной :)
статья здорово помогла…
Post #: 21
Кто-то сможет помочь в маленьком задании? - 2007-10-19 21:41:50.573333   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Привет всем, заранее извините.
Надо запустить файл с параметром. Visual studio 6.0

char* par1;
char* par2;
char* sumpar;
par1="cmd.exe";
par2="Привет";
sumpar="Ваня"+par2+"петя";//КАК ЭТО сложить
ShellExecute(Null,"open",par1,sumpar,NULL,SW_SHOW);
Post #: 22
Извините ступил. - 2007-10-19 22:28:34.520000   
Guest

Сообщений: 83368
Оценки: 51
Присоединился: None
Спасибо за помощь
Post #: 23
Страниц:  [1]
Все форумы >> [Обсуждение статей] >> Забытые секреты кодинга №2: строковые операции в C







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.