Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
 Аватар для BaredJJ
19 / 18 / 7
Регистрация: 16.05.2017
Сообщений: 447

Как преобразовать char* к std::string

06.02.2021, 16:56. Показов 4031. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день столкнулся с проблемой. Я передаю из C# кода строку в dll написанную на C++. Аргументом функции в dll является char*, мне нужно преобразовать ее в std::string. Тут происходит точно что то не тривиальное, по тому что строка инициализируется нормальным размером и она действительно заполняется валидными данными, но вот если на ней вызвать метод c_str, то она возвращает только первую букву и VisualStudio тоже показывает только первую букву. Скриншоты прилагаю.
Что это может быть?
Миниатюры
Как преобразовать char* к std::string   Как преобразовать char* к std::string  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.02.2021, 16:56
Ответы с готовыми решениями:

Как правильно преобразовать строку std::string (массив байт) в std::char*
Я использую библиотеку CryptoPP для AES и RSA шифрования. И у меня возникает проблема при преобразовании std::string в const std::char*. На...

Преобразовать const unsigned char* в std::string (или _bstr_t )
Здравствуйте старшие товарищи! Есть функция, которая возвращает результат типа const unsigned char*. а мне нужно получить ...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

25
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.02.2021, 02:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от BaredJJ Посмотреть сообщение
Что это может быть?
Вам нужно разобраться что у Вас там происходит ?
Почему LoadObject(char * ?
Почему размер 79, не кратный двум ?
(скорее всего последний нуль будет лишним при приведении к wchar_t*, или еще что ...)

Пример конвертации , сильно не разбирался, не было необходимости.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
//using namespace std;
 
int main()
{
 
    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
    const std::wstring wide_string = L"This is a string";
    std::wcout<<L"Text in wide string : "<<wide_string<<std::endl;
    const char * cstr=(char*)(wide_string.c_str());
    const wchar_t * wstr=(wchar_t*)(cstr);
    const size_t str_size = wide_string.size()*2;
    std::cout<<"Try print a wchar_t * as char* : "<<cstr<<std::endl;
    std::cout<<"WideString as char in HEX view : ";
    for (size_t i =0; i<str_size; ++i)
       std::cout<<std::hex<<(int)cstr[i]<<' ';
    std::cout<<std::endl;
 
    std::cout<<"WideString as char view : ";
    for (size_t i =0; i<str_size; ++i)
       std::cout<<(char)cstr[i]<<' ';
    std::cout<<std::endl;
    const std::string utf8_string = converter.to_bytes(wide_string);
    // const std::string utf8_string = converter.to_bytes(wide_string.c_str()); // wchar_t *
   const std::string utf8_string2 = converter.to_bytes(wstr); // wchar_t *
    std::cout<<"String after converting : "<<utf8_string<<std::endl;
    std::cout<<"String after converting : "<<utf8_string2<<std::endl;
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
07.02.2021, 03:36
Цитата Сообщение от _stanislav Посмотреть сообщение
в std::string нулей быть не должно.
Что значит "не должно"? Никто не запрещает вам хранить в std::string нулевые символы. Для std::string нулевой символ не обладает никаким специальным статусом вне контекстов, связанных с С-строками.
0
07.02.2021, 10:01

Не по теме:


Цитата Сообщение от DenAlpetyan Посмотреть сообщение
Наверно я хотел сказать о тех знаниях, которые дают основную, исчерпывающию картину о кремниевых - транзисторных компьютерах и не только
Цитата Сообщение от DenAlpetyan Посмотреть сообщение
Все основные вопросы, а что там? Отлетают.
Если обладаешь такими знаниями - то это просто превосходно, отлично. Знания никогда не бывают лишними. Но, думаю, что в высокоуровневом программировании они вряд ли помогут. Да - код, написанный человеком с такими познаниями, может быть эффективнее. Но всякого рода оптимизации запросто могут столкнуться на неприятие со стороны коллег. И вы будете постоянно выслушивать в свой адрес что-нибудь в духе:"О боже, что за дичь ты тут понаписал?!!!!"

А вот если речь идёт о программировании на уровне железа, то без таких знаний необойтись

0
07.02.2021, 10:10

Не по теме:

Recrut_rf, Спасибо за понимание.

0
15 / 15 / 3
Регистрация: 18.05.2019
Сообщений: 851
07.02.2021, 20:31
Конвертация из wchar_t с нулями, в string с нулями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#define _CRT_SECURE_NO_WARNINGS
 
#include <Windows.h>
#include <iostream>
#include <string>
#include <conio.h>
 
int main()
{
setlocale(LC_ALL, "");
 
wchar_t szStrwz[1024] = {L"e\0rwert\0h\0fdtuy"}; // строка с нулями.
wchar_t szStrw[1024] = {0}; // строка без нулей.
char szStrc[1024] = {0}; // строка char без нулей.
char szStrcz[1024] = {0}; // строка char с нулями.
std::string Strs;
Strs.clear();
 
int len1 = 20; // размер wchar_t строки с нулями, если известен размер строки.
 
BOOL arrNull[1024] = {FALSE}; // счетчик нулей, в массиве флагов нулей.
 
int i = 0, j = 0; // счетчики цикла.
// убираем нули.
while(i < len1)
{
    if(szStrwz[i] != L'\0')
    {
        szStrw[j] = szStrwz[i];
        arrNull[i] = TRUE; // если не нуль.
        j++; i++;
    }
    else
    {
        arrNull[i] = FALSE; // если нуль.
        i++;      
    }
}
 
// переводим в char.
size_t len2 = wcstombs(szStrc, szStrw, wcslen(szStrw));
 
std::cout << szStrc << std::endl;
 
// заполняем string вместе с нулями.
i = 0, j = 0;
while(i < len1)
{
    if(arrNull[i] == TRUE)
    {
        Strs.push_back(szStrc[j]);
        j++; i++;
    }
    else
    {
        Strs.push_back('\0');
        i++;      
    }
}
 
std::cout << Strs << std::endl;
 
_getch();
return 0;
}
Добавлено через 1 час 43 минуты
Строка char szStrcz[1024] = {0}; не нужна.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.02.2021, 22:23
BaredJJ,
Цитата Сообщение от BaredJJ Посмотреть сообщение
Я передаю из C# кода строку в dll написанную на C++. Аргументом функции в dll является char*, мне нужно преобразовать ее в std::string.
Непонятно, вот что. Какое значение имеет преобразование char* в std::string ??
Если вам удалось передать и принять char* то проблемы же уже нет ?
BaredJJ, посмотрите как вы назвали тему
Цитата Сообщение от BaredJJ Посмотреть сообщение
Как преобразовать char* к std::string
Сколько людей выскажется об этом непечатно? Тема уже имеет почти килопросмотр. Это люди, пришедшие на название.
BaredJJ, передача данных из управляемого кода в неуправляемый - вопрос достаточно сложный, но ноги растут из
CLR ( C# упрощённо говоря). Тут на форуме есть раздел:
https://www.cyberforum.ru/csharp-beginners/
посмотрите так же (для сугреву) :
Класс Marshal, использование PInvoke, небезопасный код (unsafe)
особенно от пункта 3.7
А что касается кодировок, то перевод в ANSI той кодировки, что вы используете (вы знаете какая она, надеюсь), это ваш вопрос. Но с ним уже будет легче туда же (имо).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2021, 22:23

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; freopen(fileName, &quot;r&quot;, stdin); while...

Как преобразовать char* в string и вывести переменную string на экран?
for (int k = 0; k &lt; 10; k++) { int x = (int)rand() / RAND_MAX + rand() % 6 + 2; char *chars = new char; ...

std::getline Альтернатива для (std::string, int, char)
Есть у кого идеи? Есть строка чисел(разделены пробелами), хочу считывать числа до пробела в инт затем уже работать засунуть этот инт в...

Странная ошибка: [Error] no match for call to '(std::string {aka std::basic_string<char>}) (int&)'
У меня появляется проблема при компиляции сей программы: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;sstream&gt; ...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru