конкатенация строк. как?
может это идиотский вопрос, но может мне кто-нибудь объяснить как в C++ производить конкатенацию строк? я замучился искать у меня три книги и ни в одной не сказано как это делается.
Код:
char *strcat(char s1, const char *s2);
которая добавляет строку s2 к строке s1. Возращает функция значение s1.
есть еще char *strncat(char *s1, const char *s2, size_t n);, она добавляет небольше n символов строки s2 к строке s1.
p.s. что бы найти эту функцию и 5 минут не потребаволось :)
Код:
std::string str1 = "Hello ";
std::string str2 = "world";
std::string str3 = str1 + str2;
std::string str2 = "world";
std::string str3 = str1 + str2;
заранее благодарен :)
А воспользуйся поиском по форуму.
К вопросу о строках - программисту, попавшему в мир Visual C++ из другого мира (например Perl) особенно сложно приходится именно со строками. Меня мучает такой вопрос:
если операции с файловой системой требуют TCHAR
с сетью - WCHAR
встроенные функции и функции стандартной библиотеки - char*, std::string
то:
1. На какой вид строк операться при проектировании своих классов что бы не было проблем с пунктом 2 (char*, std::string, CString или что-то еще)
2. Как их конвертировать без гемороя
Это на вскидку пара вопросов.
Если кто-то даст вразумительное описание, было бы очень полезно.
Отписка типа
[COLOR="Lime"]Green[/COLOR]
Цитата:
C++ сложение строк элементрано:
Код:
std::string str1 = "Hello ";
std::string str2 = "world";
std::string str3 = str1 + str2;
Код:
std::string str1 = "Hello ";
std::string str2 = "world";
std::string str3 = str1 + str2;
не катит, т.к. для контекста std::string, действительно элементарно, а вот для char*, извините, но полная поебень!
[/QUOTE]
Если обычный char * str;
то sprintf(str,"%d", intVar);
Если исспользовать различные классы:
например MFC-шный CString str;
str.Format("%d", intVar);
При желании можно и так например:
ostringstream ss;
ss << intValue;
ss.str();
Вобщем выбирай по душе ))
[QUOTE=x2ES]
К вопросу о строках - программисту, попавшему в мир Visual C++ из другого мира (например Perl) особенно сложно приходится именно со строками. Меня мучает такой вопрос:
если операции с файловой системой требуют TCHAR
с сетью - WCHAR
встроенные функции и функции стандартной библиотеки - char*, std::string
1. На какой вид строк операться при проектировании своих классов что бы не было проблем с пунктом 2 (char*, std::string, CString или что-то еще)
2. Как их конвертировать без гемороя
[/QUOTE]
Собственно исспользовать надо те с которыми удобно в работать в ваших классах. Собственно ничего особенного в каждом из них нет и каждый конвертируеться без проблемм.
у CString есть c_str(); Сам же он принимает кучу параметров.
А по поводу WCHAR, TCHAR и т.п. есть множество макросов конвертирования - читайте MSDN:
A2BSTR, OLE2A, T2A, W2A, A2COLE, OLE2BSTR, T2BSTR, W2BSTR, A2CT, OLE2CA, T2CA, W2CA, A2CW, OLE2CT, T2COLE, W2COLE, A2OLE, OLE2CW,T2CW, W2CT, A2T, OLE2T, T2OLE, W2OLE, A2W, OLE2W, T2W, W2T
Но это уже больше относиться именно к виндовому програмированию нежели к самому C++
:)))
[QUOTE=x2ES]
Отписка типа
[COLOR="Lime"]Green[/COLOR]
не катит, т.к. для контекста std::string, действительно элементарно, а вот для char*, извините, но полная поебень![/QUOTE]
блин для char * писали же выше. Читать надо внимательнее :))
для char * используется еще C-шный strcat :)))
[/QUOTE]
Думаю, воспользоваться поиском по форуму может программист любой квалификации и направления.
[QUOTE=x2ES]Отписка типа
[COLOR="Lime"]Green[/COLOR]
не катит, т.к. для контекста std::string, действительно элементарно, а вот для char*, извините, но полная поебень![/QUOTE]
Т.е. элементарный вещи озвучивать не надо, а надо лишь пое..нь?
Кроме того, в C++, по которому и был вопрос, типичной строкой является std::string, а не C-string.
Так может, лучше показать человеку, как делать правильнее и проще, чем рассказывать про пое..нь?
P.S. Ты хотел что-то сказать по теме или так... жизни поучить?
Поиском воспользоваться можно - но очень много воды. Когдя я ищу ответы на вопросы, из ответов складывается впечатление, что все жутко сложно. Когдя я смотрю как отвечают на вопросы в которых я хорошо разбираюсь - я понимаю, что человек по этому форуму ничего не поймет. Надо признать что и вопросы не всегда корректно ставятся.
[QUOTE=Green]Т.е. элементарный вещи озвучивать не надо, а надо лишь пое..нь?
Кроме того, в C++, по которому и был вопрос, типичной строкой является std::string, а не C-string.
Так может, лучше показать человеку, как делать правильнее и проще, чем рассказывать про пое..нь?[/QUOTE]
Я думаю было бы правильнее в начале того сообщения как минимум написать "если дело касается std::string то это так". А, вообще, идеальным был бы сабж вида (с учетом, что человек спрашивающий плавает в этой теме)
"В сях существуют такие виды строк:
С-style строки (char*) - коротенько про то что наследие из C для совместимости
std::string - компонент стандартной библиотеки - коротенько про приемущества распределения памяти и т.д.
но если вы пишите под винду и не дай Бог под PDA, то все это поебень!!! :)), ведь там все к Unicode идет (основная то проблема!!!!)
и вам необходимо будет использовать
CString
TCHAR
WCHAR
Далее можно написать про то, что существует множество макросов конвертирования:
A2BSTR, OLE2A, T2A, W2A, A2COLE, OLE2BSTR, T2BSTR, W2BSTR, A2CT, OLE2CA, T2CA, W2CA, A2CW, OLE2CT, T2COLE, W2COLE, A2OLE, OLE2CW,T2CW, W2CT, A2T, OLE2T, T2OLE, W2OLE, A2W, OLE2W, T2W, W2T
и почему нет функции вида WCHAR_to_TCHAR и почему все сложно. В MSDN-е без понимания сути делать нечего, а между книгой Страуструпа и MSDN-ом есть огромная пропость недоговорок, в которых эта суть и спрятана.
и т.д.
"
одного такого сабжа достаточно для того, что бы не разводить полемику
P.S.: что касается того, что std::string по дефолту, то меня как новечка смущало то, что дофига функций принимают именно char*
Лично мое мнение:
1) давать надо ответ по вопросу не расплываясь по древу,
2) давать ответ надо по той части, что ещё не была освещена,
3) не надо думать за человека и придумывать, какой вопрос у него будет следующим, пусть он сделает это сам и задаст следующий вопрос,
4) "учебники" типа приведенной тобой монограммы не только скучны, отнимают много времени как у тебя, так и у того, кто его читает, но еще и вредны, т.к. засоряют голову ненужными (пока) вещами (типа, перечисления всех типов строк и макросов, которые ты знаешь) и вбивают в голову некорректную информацию, т.к.
- в "сях" нет std::string, только в С++,
- кто сказал, что нельзя использовать std::string и C-string при программировании под Windows?
- что значит "необходимо будет использовать CString, TCHAR, WCHAR" ? Ведь это же полная охинея!
- почему нет функции WCHAR_to_TCHAR? :D
Может тогда озвучить отсутствие множества других отсутствующих функций, например, CreateCoolProgram?
- какое отношение книга Страуструпа имеет к MSDN? :D
- какая там пропасть? Недоговорок? Это заговор! :D
P.S. Для того что бы учить других, желательно иметь соотв. уровень. Если нет уверенности или знаний сказать что-либо по теме, не стоит учить других, как им отвечать.
- Скажи, как ты будешь std::string передавать, например, в функции toolhelp (работа с процессами сервисами и т.д.)?
- Книги Страуструпа не потеря времени, а метод научится понимать что ты используешь и почему.
- Согласись, CreateCoolProg и WCHAR_to_TCHAR не одно и то же, лучше бы написал почему нужно *баться со всеми этими макросами.
- А пропость между Страуструпом и MSDN - просто набор книг по Visual C++, пока хорошей под руку не попалось, вот и сижу на форумах.
Кстати актуальность полного ответа может подтвердить создатель темы
[QUOTE=N-John]я замучился искать у меня три книги и ни в одной не сказано как это делается.[/QUOTE]
Я уже не ищу. Потому что нету.
[/QUOTE]
Однако, как отвечать другим ты расписал...
[QUOTE=x2ES]
- Скажи, как ты будешь std::string передавать, например, в функции toolhelp (работа с процессами сервисами и т.д.)?
[/QUOTE]
c_str()
[QUOTE=x2ES]
- Книги Страуструпа не потеря времени, а метод научится понимать что ты используешь и почему.
[/QUOTE]
А я то думал, что это учебник по С++.
[QUOTE=x2ES]
- Согласись, CreateCoolProg и WCHAR_to_TCHAR не одно и то же, лучше бы написал почему нужно *баться со всеми этими макросами.
[/QUOTE]
А я не знаю "почему нужно *баться со всеми этими макросами" и для чего?
WCHAR_to_TCHAR... :)
Ты это серьезно?
Есть смысл объяснять, что TCHAR - это макрос раскрывающийся в char или wchar в зависимости от настроек проекта?
Придерживайся правила, что если ты пишешь Unicode-проект, то используй везде Unicode, а если ASCII, то везде используй ASCII.
И тебе не понадобиться WCHAR_to_TCHAR.
[QUOTE=x2ES] - А пропость между Страуструпом и MSDN - просто набор книг по Visual C++, пока хорошей под руку не попалось, вот и сижу на форумах.
[/QUOTE]
Опять не понимаю, какая связь между цчебником С++ и описанием библиотек Windows?
[QUOTE=x2ES]
Кстати актуальность полного ответа может подтвердить создатель темы
[/QUOTE]
А не рассказать ли в контексте "конкатенация строк" про вывод этих самых строк разными шрифтами на игровой приставке PSP, а потом на PS2 и Xbox и т.д. Вот и будет полный ответ... тома на три...
Цитата:
WCHAR awcToName[] = TEXT("DomainName*");
WCHAR awcFromName[] = TEXT("MyComputer");
WCHAR awcMesgBuffer[MESGLEN] = TEXT("This ia Test Message");
NET_API_STATUS nasStatus;
nasStatus = NetMessageBufferSend(NULL,
awcToName,
awcFromName,
awcMesgBuffer,
MESGLEN);
WCHAR awcFromName[] = TEXT("MyComputer");
WCHAR awcMesgBuffer[MESGLEN] = TEXT("This ia Test Message");
NET_API_STATUS nasStatus;
nasStatus = NetMessageBufferSend(NULL,
awcToName,
awcFromName,
awcMesgBuffer,
MESGLEN);
Компилятор:
Цитата:
cannot convert parameter 4 from 'unsigned short [50]' to 'unsigned char *'
Как бороться с подобного вида ситуациями?
Цитата:
#define UNICODE
#define MESGLEN 50
#define MESGLEN 50
Во-вторых, не следует явно объявлять макрос UNICODE, это лучше сделать через настройки проекта.
В-третьих, внимательно читай MSDN:
Цитата:
NET_API_STATUS NetMessageBufferSend(
LPCWSTR servername,
LPCWSTR msgname,
LPCWSTR fromname,
LPBYTE buf,
DWORD buflen
);
В-четвертых, лучше использовать константы, а не макросы.
В-пятых, откуда взялось число 50? Не стоит использовать магические числа, значения должны быть четко определенными.
Исходя из этого твой код должен выглядеть так:
Код:
WCHAR awcToName[] = L"DomainName*";
WCHAR awcFromName[] = L"MyComputer";
BYTE awcMesgBuffer[] = "This ia Test Message";
const DWORD MESGLEN = sizeof awcMesgBuffer;
NET_API_STATUS nasStatus = NetMessageBufferSend(NULL, awcToName,
awcFromName, awcMesgBuffer, MESGLEN);
WCHAR awcFromName[] = L"MyComputer";
BYTE awcMesgBuffer[] = "This ia Test Message";
const DWORD MESGLEN = sizeof awcMesgBuffer;
NET_API_STATUS nasStatus = NetMessageBufferSend(NULL, awcToName,
awcFromName, awcMesgBuffer, MESGLEN);
или даже так:
Код:
NET_API_STATUS nasStatus = NetMessageBufferSend(NULL, L"DomainName*",
L"MyComputer", (LPBYTE)"This ia Test Message", sizeof awcMesgBuffer);
L"MyComputer", (LPBYTE)"This ia Test Message", sizeof awcMesgBuffer);
Правда проблема с конвертацией - в результате сообщение выдается в виде ?????????????????
В приведенном мною коде нет никакой конвертации.
Видимо, ты что-то намудрил на приемной стороне, либо не те данные передаешь.
Определись, что тебе и в каком виде надо передать, и как с этим быть на приемной стороне.
Но глядя на результат ("?????") понятно, что она нужна.
Я думаю меня спасет MultiByteToWideChar().
Но глядя на результат ("?????") понятно, что она нужна.
Я думаю меня спасет MultiByteToWideChar().[/QUOTE]
Ну что за пристрастие к методу тыка?
Ты выяснил, почему выводятся вопросы?
Может, потому, что приемная сторона ждет не ASCII, а Unicode?
Изучи этот вопрос, тогда возможно достаточно сделать так:
Код:
WCHAR awcToName[] = L"DomainName*";
WCHAR awcFromName[] = L"MyComputer";
WCHAR awcMesgBuffer[] = L"This ia Test Message";
const DWORD MESGLEN = sizeof awcMesgBuffer;
NET_API_STATUS nasStatus = NetMessageBufferSend(NULL, awcToName, awcFromName,
(LPBYTE)awcMesgBuffer, MESGLEN);
WCHAR awcFromName[] = L"MyComputer";
WCHAR awcMesgBuffer[] = L"This ia Test Message";
const DWORD MESGLEN = sizeof awcMesgBuffer;
NET_API_STATUS nasStatus = NetMessageBufferSend(NULL, awcToName, awcFromName,
(LPBYTE)awcMesgBuffer, MESGLEN);
У меня вариант этот с ошибкой завершался, я думал ошибка в преобразовании типов, а там по совпадению hostname был прописан без звездочки в конце. Сейчас Ок.
По поводу звездочки в конце - в первый раз вижу такое.
т.е.
WCHAR awcToName[] = L"ComputerName*"; - [COLOR="Lime"]нормально[/COLOR]
WCHAR awcToName[] = L"ComputerName"; - [COLOR="Red"]фигня[/COLOR]
у меня сеть под Novell
А че это вообще такое? :confused:
объединение ))
Честно сказать - никогда не пользовался, а для чего это нужно?
Блин для чего еще, чтобы из 2-х строк получить одну ))
операции с файловой системой требуют TCHAR
с сетью - WCHAR
встроенные функции и функции стандартной библиотеки - char*, std::string
то:
1. На какой вид строк операться при проектировании своих классов что бы не было проблем с пунктом 2 (char*, std::string, CString или что-то еще)
2. Как их конвертировать без гемороя
Это на вскидку пара вопросов.
Если кто-то даст вразумительное описание, было бы очень полезно.
[/QUOTE]
TCHAR - "универсальный" символ - макрос, который раскрывается в обычный char или двухбайтовый в зависимости от настроек проекта. Соответственно WinAPI-функции имеют два варианта - FunctionNameA и FunctionNameW, например, соответственно CreateFileA, CreateFileW, просто в соответствующем хэдере сидит макрос CreateFile, который раскрывается в A или W версию опять же в зависимости настроек проекта. Соответственно, есть строки - LPTSTR и LPCTSTR, которые являются макросами и раскрываются в char* или wchar_t*, const char* или const wchar_t* опять же в зависимости от настроек. А тип WCHAR, который промелькнул в твоем вопросе, опять же макрос раскрывающийся в wchar_t. Дело в том, что некоторые сетевые функции, видимо, не имеют char-варианта.
стандартные C/C++ функции имеют также по два варианта, и даже если нет макроса на каждую функцию, который раскроется на нужный вариант в зависимости от настроек, его легко сделать самому.
В общем, используй везде TCHAR, LPTSTR, LPCTSTR и все будет ОК. Кроме твоих сетевых функций.
П. С. CString - тоже макрос, который раскрывается на соответствующую версию шаблонного класса CStringT.
Спасибо за ответ.