Вот этот
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;
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 для владения этой строкой — есть два варианта.
В первом случае вам нужно сделать это: (Я предполагаю, что 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());
Ваш код должен быть
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*
так как память будет уничтожена после выхода из функции.
ПРОБЛЕМА РЕШЕНА (почему?: 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, он не работает