Передача управляющего символа в массив символов

Вот этот

char *house2="JAM gain\r\n"

отличается от этого:

string house, prefix="JAM ", suffix="\r\n";
cin>>house;
house = prefix + nickname + suffix;

char house2[100];
strncpy(house2, house.c_str(), sizeof(house));
return house2;

Хотя я набираю «усиление» на клавиатуре, мне нужно пропустить это char массив с управляющими символами для api потому что без них кажется, что это не работает. что я могу сделать, чтобы решить проблему?

ОК, реальный код:

string nickname, prefix="NICK ", suffix="\r\n";
cout<<"Choose nickname\n";
cin>>nickname;
nickname = prefix + nickname + suffix;
cout<<nickname;

char nick[100];
strncpy(nick, nickname.c_str(), sizeof(nickname));
return nick;

0

Решение

sizeof не делает то, что вы думаете. Вместо

strncpy(nick, nickname.c_str(), sizeof(nickname));

ты хочешь

strncpy(nick, nickname.c_str(), nickname.size());

Но даже тогда вы открываете себя для переполнения буфера, так что вы действительно хотите

strncpy(nick, nickname.c_str(), sizeof(nick));

Следующая проблема заключается в том, что nick является локальным для вашей функции, поэтому возвращение будет «вызывать плохие вещи». Вы можете сделать его статическим (а потом столкнуться со сложными проблемами с потоками …) или передать его в качестве аргумента (что будет означать, что вы не сможете использовать его). sizeofпо техническим причинам). Что вам действительно нужно, так это намного проще — просто верните строку, а не строку C.

string getNick() {
string nickname, prefix="NICK ", suffix="\r\n";
cout<<"Choose nickname\n";
cin>>nickname;
nickname = prefix + nickname + suffix;
cout<<nickname;
return nickname;
}

И просто чтобы показать, что он действительно делает то, что должен, вот рабочая онлайн версия. Вот полный код для потомков:

#include <iostream>
#include <string>

std::string getNick() {
std::string nickname, prefix="NICK ", suffix="\r\n";
std::cout<<"Choose nickname\n";
std::cin>>nickname;
nickname = prefix + nickname + suffix;
std::cout<<nickname;
return nickname;
}

int main() {
std::string nick = getNick();

std::cout<<"in main nick = '"<<nick<<"'"<<std::endl;
}

вход

gain
.

Выход

Choose nickname
NICK gain
in main nick = 'NICK gain
'

Поскольку у вас есть API, который принимает строку C, вам необходимо проверить детали этого API для владения этой строкой — есть два варианта.

  1. API становится владельцем строки C и освобождает ее позже.
  2. API создает копию строки C, и вы контролируете ее время жизни.

В первом случае вам нужно сделать это: (Я предполагаю, что C api, который в конечном итоге будет free переданный в указателе — если это плохо разработанный C ++ API, который будет delete[] это, вам нужно заменить malloc с new char[nick.size()]

string nick = getNick();
char * buffer = (char*)malloc(nick.size()+1);
memcpy(buffer, nick.c_str(), nick.size());
buffer[nick.size()]=0;
your_api(buffer);

Во втором случае вы можете просто сделать

your_api(getNick().c_str());
4

Другие решения

Ваш код должен быть

string house, prefix="JAM ", suffix="\r\n";
string nickname;
cin>>nickname;
house = prefix + nickname + suffix;

char house2[100];
strncpy(house2, house.c_str(), sizeof(house2));
//or strncpy(house2, house.c_str(), house.length());
return string(house2);

Не вернуть house2 как char* так как память будет уничтожена после выхода из функции.

0

ПРОБЛЕМА РЕШЕНА (почему?: P)

string prawniczek=choosenick();
int TempNumOne=prawniczek.size();
char niczek[40];
for (int a=0;a<=TempNumOne;a++)
{
niczek[a]=prawniczek[a];
}

хорошо проблема была решена простым переписыванием символов в позиции индекса один за другим

это должно означать, что
strncpy с никнеймом.c_str () работает иначе.

во всяком случае — я думаю, что это не элегантный способ, хотя он работает

Кто-нибудь знает, как это сделать правильно?

ОБНОВИТЬ:
более того:
когда цикл находится в main при преобразовании в массив char из метода choosenick (), он работает отлично, но когда я делаю это внутри метода choosenick () и возвращаю преобразованный результат цикла в main, он не работает

0
По вопросам рекламы [email protected]