| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Строковые переменные, char, char*, CString... |
| Автор: OlgaKor 13.1.2003, 00:03 |
| Расскажите (или скажите где можно прочитать) про работу со строковыми переменными в VC++ : разницу между const char, char, CString, char*, const char*, что такое strcpy(), и как конвертировать одно в другое, в каких случаях чем пользоваться. Например, в функциях типа itoa() и atoi() VC требует строгого соответствия с типом, описанном в MSDN, хотя по логике могут подходить и другие. Любая информация про строковые переменные |
| Автор: Step 13.1.2003, 01:11 |
| нужно использовать преобразователи типов. |
| Автор: Kefir 13.1.2003, 03:05 |
| Поскольку ты спрашиваешь разницу между char и char*, то видно, что ты плохо разбираешься в Си++, надыбай себе учебник по Си для начинающих, именно там есть ответы на все эти вопросы (кроме CString, но про этот класс всё написано на msdn.microsoft.com). |
| Автор: OlgaKor 13.1.2003, 03:42 |
| Хорошо, переформулирую: Я бы с удовольствием всегда пользовалась CString, но например, в функции itoa(int, char *, int); средний параметр не может быть CString (пишет: cannot convert parameter 2 from 'class CString' to 'char') почему? И еще, что такое LPCTSTR. Заранее благодарно. |
| Автор: Vaulter 13.1.2003, 05:47 | ||
| LPSTR описан как #define char* LPSTR то есть как указатель на символы сделано типа того для легкой смены .h файлов при не смене кода =) чтобы перевести СString в чары нужно использовать ОПЕРАТОР LPCTSTR
|
| Автор: Baa 13.1.2003, 10:15 |
| а зачем использовать itoa, если юзаем CString? CString.Format ("%d", iSomeInt); |
| Автор: Step 13.1.2003, 20:59 | ||
|
| Автор: val 14.1.2003, 01:28 |
| CString - это класс, описанный в MFC. Придется постоянно подключать эту библиотечку. Рекомендую разобраться с "char* String" этого должно хватить на весь С++... |
| Автор: Turboman 15.1.2003, 05:17 | ||||
Если надо-strex.h
Пригодится и СSTRING очень удобный тип и при желании конвертируется в любой другой |
| Автор: Fantasist 15.1.2003, 05:49 | ||
Не-а, лучше std::string |
| Автор: Kefir 15.1.2003, 05:59 |
| Всё равно я за CString. хотя довольно часто юзаю простые char-ы. |
| Автор: Alex101 15.1.2003, 08:26 |
| А еще лучше писать на таком замечательном языке как Бейсик, желательно под ДОС - там указателей явных нет ЗЫ И этот форум не понадобится |
| Автор: Kefir 16.1.2003, 04:48 |
| что то я не верю что это лучше... |
| Автор: Nastya 16.1.2003, 22:52 |
| И так: char - это один символ (1 байт информации) может принимать значение от 0 до 255 (ASCII - код символа) К работе со строками можно подходить с той точки зрания, что строка это массив символов. Поэтому строку можно описать так char str[255] - строка из 255 символов (естественно может быть любое другое количество. char str* - это указатель на символ (или на массив символов). Кроме того строка "должна" заканчиваться нуллевым символом \0, который рассматривается как признак конца строки, т.е. 'a' - один символ "a"- два символа a и \0. PCTSTR - говорит о том, что это должна быть именно строка, заканчивающаяся нулевым символом. CString - это класс, который предназначен облегчить работу со строками. 2OlgaKor надеюсь помогла, если не запутала еще сильней На самом деле, я считаю, что строки одна из тем С++, которые не выучишь пока не набъешь приличное количество "шишек" |
| Автор: Alex101 17.1.2003, 09:07 |
| В char могут храниться значения [-128;127]. (по умолчанию в VC) А [0;255] - это unsigned char Тут, как говорят в Одессе, две большие разницы. |
| Автор: Vaulter 17.1.2003, 12:47 |
| 2 Nastya: char str* - это не указатель на символ char* str - указатель. |
| Автор: Kefir 17.1.2003, 17:28 |
| Если же быть ещё более точным, то char str* это указатель на место в памяти, где хранится символ. |
| Автор: Nastya 17.1.2003, 21:47 | ||
Искюзь ми, очипяталась |
| Автор: Fantasist 19.1.2003, 05:22 | ||
Если быть еще более точным, то это синтаксическая ошибка. |
| Автор: Fantasist 19.1.2003, 05:50 |
| Nastya Что, тренеруемся обучать. ;) Тогда и я добавлю. Вообще, тип char - это символ. Тип char* - это указатель на символ. Это еще не есть строка. А что такое строка? А строка - это последовательность символов. Сейчас в программировании различают два типа строк: 1. Паскалевские строки - последовательность символов, перед которой существует один или более байт(сейчас обычно 4) хранящий длинну этой строки. 2. Си-строки - последовательность символов, в конце которой стоит 0. Такие строки называют так же нуль-терменированными. Становятся популярными смешанные строки т.е. обладающие и нулем в конце и хранящие длинну строки в начале. Дело в том, что в общем случае паскалевские строки эффективнее, ибо не приходиться проходить всю строку в поисках ее конца (если вы совершаете много конкатенаций строк это особенно заметно), но поддерживать такую строку более высокоуровневая операция т. е. надо чтобы кто-то менял байты с длинной правильно выделял память, правильно интерпретировал откуда начинается сама строка и т. п. Взваливать такую работу на программиста крайне не разумно ибо это очень черевато ошибками. С - задумывался как системный язык, поэтому поддержки компилятором таких действий включенно не было это довольно таки высокоуровневая оперция не вяжется со низкоуровневыми операциями в С. Поэтому там были введены С-строки. С-строки хороши так же тем, что их очень легко стандартизировать, и следовательно легко передавать на системном уровне (например, при использовании API). Так что тип char* - это просто указатель на символ. Это не строка - но ту последовательность, которая идет за тем символом на который указывает этот указатель мы и называем строкой, а признаком ее окончания считаем нулевой символ. В Си все-таки небольшая поддержка компилятором есть, потому что когда мы пишим "строка" - то компилятор сам добавляет нулевой символ в конец. Нам не надо писать "строка\0" Тип char[] - это массив символов. Опять же это не строка, но мы можем считать его строкой (а можем и не считать). |
| Автор: HexoGenus 19.1.2003, 08:29 | ||
угу ... здорово сказано... поэтому я и люблю String strTemp; там у нас в зависимости от задачи имеется выбор варианта работы или мы все доверяем функциям класса и их скорости работы или обращаемся к его содержимому через указатель strTemp.c_str() и работаем с ним как с char-строкой... причем в любом месте можем поставить \0 или динамически изменить размер массива хранящего нашу строку через strTemp.SetLength(n); |
| Автор: HexoGenus 19.1.2003, 08:31 |
| ! А как здесь удалить лишнее сообщение? |
| Автор: Fantasist 20.1.2003, 08:46 | ||
Да, я тоже постоянно пытаюсь обратить внимание народа на это. То есть на классы строк - они гораздо удобнее, безопаснее и эффективнее, ибо чаще всего они являются как раз смешенными типами строк, и умеют пользоваться преимуществами обоих форматов. (хотя есть моменты когда удобнее работать непосредственно с указателем). Стандатрная библиотека С++ предоставляет класс строки std::string (который на самом деле в псевдоним для std::basic_string<char>). VC предоставляет свой класс CString, как с этим дела в Builder'е не знаю. |