Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

конкатенация строк. как?

5.7K
10 июля 2006 года
N-John
52 / / 05.07.2006
может это идиотский вопрос, но может мне кто-нибудь объяснить как в C++ производить конкатенацию строк? я замучился искать у меня три книги и ни в одной не сказано как это делается.
242
10 июля 2006 года
Оlga
2.2K / / 04.02.2006
если верить Дейтелу тебе поможет функция
 
Код:
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 минут не потребаволось :)
3
10 июля 2006 года
Green
4.8K / / 20.01.2000
В C++ сложение строк элементрано:
 
Код:
std::string str1 = "Hello ";
std::string str2 = "world";

std::string str3 = str1 + str2;
5.7K
11 июля 2006 года
N-John
52 / / 05.07.2006
спасибо, а может подскажете еще как преобразовать переменную например типа int в переменную string и присобачить ее к какой-либо строке?

заранее благодарен :)
3
11 июля 2006 года
Green
4.8K / / 20.01.2000
А воспользуйся поиском по форуму.
18K
20 июля 2006 года
x2ES
18 / / 20.07.2006
Вопрос действительно живой и подводных камней очень много (для новичков). Если Вы опытный программист, отвечая в форуме постарайтесь не забывать то, что очевидное для Вас может казаться совершенно невероятным для новичков. При том в шкуре новичка могут оказаться опытные программисты на других языках.

К вопросу о строках - программисту, попавшему в мир 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, действительно элементарно, а вот для char*, извините, но полная поебень!

240
20 июля 2006 года
aks
2.5K / / 14.07.2006
[QUOTE=N-John]спасибо, а может подскажете еще как преобразовать переменную например типа int в переменную string и присобачить ее к какой-либо строке?
[/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 :)))
3
20 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=x2ES]Вопрос действительно живой и подводных камней очень много (для новичков). Если Вы опытный программист, отвечая в форуме постарайтесь не забывать то, что очевидное для Вас может казаться совершенно невероятным для новичков. При том в шкуре новичка могут оказаться опытные программисты на других языках.
[/QUOTE]
Думаю, воспользоваться поиском по форуму может программист любой квалификации и направления.

[QUOTE=x2ES]Отписка типа

[COLOR="Lime"]Green[/COLOR]


не катит, т.к. для контекста std::string, действительно элементарно, а вот для char*, извините, но полная поебень![/QUOTE]
Т.е. элементарный вещи озвучивать не надо, а надо лишь пое..нь?
Кроме того, в C++, по которому и был вопрос, типичной строкой является std::string, а не C-string.
Так может, лучше показать человеку, как делать правильнее и проще, чем рассказывать про пое..нь?

P.S. Ты хотел что-то сказать по теме или так... жизни поучить?
18K
21 июля 2006 года
x2ES
18 / / 20.07.2006
[QUOTE=Green]Думаю, воспользоваться поиском по форуму может программист любой квалификации и направления.[/QUOTE]

Поиском воспользоваться можно - но очень много воды. Когдя я ищу ответы на вопросы, из ответов складывается впечатление, что все жутко сложно. Когдя я смотрю как отвечают на вопросы в которых я хорошо разбираюсь - я понимаю, что человек по этому форуму ничего не поймет. Надо признать что и вопросы не всегда корректно ставятся.


[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*
3
21 июля 2006 года
Green
4.8K / / 20.01.2000
Ну а чтож ты, педагог, не ответил "правильно", а начал учить как жить и как отвечать.

Лично мое мнение:
1) давать надо ответ по вопросу не расплываясь по древу,
2) давать ответ надо по той части, что ещё не была освещена,
3) не надо думать за человека и придумывать, какой вопрос у него будет следующим, пусть он сделает это сам и задаст следующий вопрос,
4) "учебники" типа приведенной тобой монограммы не только скучны, отнимают много времени как у тебя, так и у того, кто его читает, но еще и вредны, т.к. засоряют голову ненужными (пока) вещами (типа, перечисления всех типов строк и макросов, которые ты знаешь) и вбивают в голову некорректную информацию, т.к.
- в "сях" нет std::string, только в С++,
- кто сказал, что нельзя использовать std::string и C-string при программировании под Windows?
- что значит "необходимо будет использовать CString, TCHAR, WCHAR" ? Ведь это же полная охинея!
- почему нет функции WCHAR_to_TCHAR? :D
Может тогда озвучить отсутствие множества других отсутствующих функций, например, CreateCoolProgram?

- какое отношение книга Страуструпа имеет к MSDN? :D
- какая там пропасть? Недоговорок? Это заговор! :D

P.S. Для того что бы учить других, желательно иметь соотв. уровень. Если нет уверенности или знаний сказать что-либо по теме, не стоит учить других, как им отвечать.
18K
21 июля 2006 года
x2ES
18 / / 20.07.2006
- На вопрос не отвечаю, потому-что полного ответа на него не знаю.
- Скажи, как ты будешь std::string передавать, например, в функции toolhelp (работа с процессами сервисами и т.д.)?
- Книги Страуструпа не потеря времени, а метод научится понимать что ты используешь и почему.
- Согласись, CreateCoolProg и WCHAR_to_TCHAR не одно и то же, лучше бы написал почему нужно *баться со всеми этими макросами.
- А пропость между Страуструпом и MSDN - просто набор книг по Visual C++, пока хорошей под руку не попалось, вот и сижу на форумах.

Кстати актуальность полного ответа может подтвердить создатель темы
[QUOTE=N-John]я замучился искать у меня три книги и ни в одной не сказано как это делается.[/QUOTE]

Я уже не ищу. Потому что нету.
3
21 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=x2ES]- На вопрос не отвечаю, потому-что полного ответа на него не знаю.
[/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 и т.д. Вот и будет полный ответ... тома на три...
18K
21 июля 2006 года
x2ES
18 / / 20.07.2006
Ладно, давай на примере и ближе к теме:

Цитата:
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);



Компилятор:

Цитата:
cannot convert parameter 4 from 'unsigned short [50]' to 'unsigned char *'



Как бороться с подобного вида ситуациями?

18K
21 июля 2006 года
x2ES
18 / / 20.07.2006
Забыл деталь
Цитата:
#define UNICODE
#define MESGLEN 50

3
21 июля 2006 года
Green
4.8K / / 20.01.2000
Во-первых, когда у тебя будут проблемы и вопросы, начинай с них, а не с поучений, как кому отвечать.

Во-вторых, не следует явно объявлять макрос 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);

или даже так:
 
Код:
NET_API_STATUS nasStatus = NetMessageBufferSend(NULL, L"DomainName*",
    L"MyComputer", (LPBYTE)"This ia Test Message", sizeof awcMesgBuffer);
18K
24 июля 2006 года
x2ES
18 / / 20.07.2006
Спасибо помогло.

Правда проблема с конвертацией - в результате сообщение выдается в виде ?????????????????
3
24 июля 2006 года
Green
4.8K / / 20.01.2000
С конвертацией где?
В приведенном мною коде нет никакой конвертации.
Видимо, ты что-то намудрил на приемной стороне, либо не те данные передаешь.
Определись, что тебе и в каком виде надо передать, и как с этим быть на приемной стороне.
18K
25 июля 2006 года
x2ES
18 / / 20.07.2006
Я понимаю, что конвертации в приведенном коде нет.

Но глядя на результат ("?????") понятно, что она нужна.

Я думаю меня спасет MultiByteToWideChar().
3
25 июля 2006 года
Green
4.8K / / 20.01.2000
[QUOTE=x2ES]Я понимаю, что конвертации в приведенном коде нет.

Но глядя на результат ("?????") понятно, что она нужна.

Я думаю меня спасет 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);
18K
25 июля 2006 года
x2ES
18 / / 20.07.2006
Я такой вариант пробовал, а потом между инициализацией буфера сообщения и вызовом функции еще лепил в MultiByteToWidwChar()

У меня вариант этот с ошибкой завершался, я думал ошибка в преобразовании типов, а там по совпадению hostname был прописан без звездочки в конце. Сейчас Ок.

По поводу звездочки в конце - в первый раз вижу такое.

т.е.

WCHAR awcToName[] = L"ComputerName*"; - [COLOR="Lime"]нормально[/COLOR]

WCHAR awcToName[] = L"ComputerName"; - [COLOR="Red"]фигня[/COLOR]

у меня сеть под Novell
4.3K
26 июля 2006 года
valeriy15
84 / / 03.04.2006
[quote=N-John]может это идиотский вопрос, но может мне кто-нибудь объяснить как в C++ производить конкатенацию строк? я замучился искать у меня три книги и ни в одной не сказано как это делается.[/quote]
А че это вообще такое? :confused:
240
26 июля 2006 года
aks
2.5K / / 14.07.2006
объединение ))
4.3K
26 июля 2006 года
valeriy15
84 / / 03.04.2006
Честно сказать - никогда не пользовался, а для чего это нужно?
240
27 июля 2006 года
aks
2.5K / / 14.07.2006
Блин для чего еще, чтобы из 2-х строк получить одну ))
350
09 августа 2006 года
cheburator
589 / / 01.06.2006
[QUOTE=x2ES]
операции с файловой системой требуют 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.
18K
10 августа 2006 года
x2ES
18 / / 20.07.2006
Спасибо за ответ.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог