Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата

CString strSports(_T("Hockey is Best!"));
TCHAR sz[1024];

lstrcpy(sz, strSports);

// If the prototype isn't known, or is a va_arg prototype,
// you must invoke the cast operator explicitly. For example,
// the va_arg part of a call to sprintf() needs the cast:

sprintf(sz, "I think that %s!\n", (LPCTSTR) strSports);

Автор: Baa 13.1.2003, 10:15
а зачем использовать itoa, если юзаем CString?
CString.Format ("%d", iSomeInt);

Автор: Step 13.1.2003, 20:59
Цитата
И еще, что такое LPCTSTR.
вот именно блогодаря этому и можно всегда использоть СString еще есть LPCSTR. Cкажу очень удобно пользоваться именно СString.

Автор: val 14.1.2003, 01:28
CString - это класс, описанный в MFC. Придется постоянно подключать эту библиотечку. Рекомендую разобраться с "char* String" этого должно хватить на весь С++...

Автор: Turboman 15.1.2003, 05:17
Цитата
Придется постоянно подключать эту библиотечку.

Если надо-strex.h
Цитата
Рекомендую разобраться с "char* String" этого должно хватить на весь С++...

Пригодится и СSTRING очень удобный тип и при желании конвертируется в любой другой

Автор: Fantasist 15.1.2003, 05:49
Цитата
Рекомендую разобраться с "char* String" этого должно хватить на весь С++...


Не-а, лучше 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
Цитата
2 Nastya: char str* - это не указатель на символ
char* str - указатель


Искюзь ми, очипяталась

Автор: Fantasist 19.1.2003, 05:22
Цитата(Guest @ 17.1.2003, 09:28)
Если же быть ещё более точным, то char str* это указатель на место в памяти, где хранится символ.

Если быть еще более точным, то это синтаксическая ошибка.  :)

Автор: 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
&#33 А как здесь удалить лишнее сообщение?

Автор: Fantasist 20.1.2003, 08:46
Цитата
поэтому я и люблю String...


Да, я тоже постоянно пытаюсь обратить внимание народа на это. То есть на классы строк - они гораздо удобнее, безопаснее и эффективнее, ибо чаще всего они являются как раз смешенными типами строк, и умеют пользоваться преимуществами обоих форматов. (хотя есть моменты когда удобнее работать непосредственно с указателем). Стандатрная библиотека С++ предоставляет класс строки
std::string (который на самом деле в псевдоним для std::basic_string<char>). VC предоставляет свой класс CString, как с этим дела в Builder'е не знаю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)