这一个
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 :(得分:4)
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;
}
只是为了表明它确实在做它应该做的事情,here's a working online version。这是后代的完整代码:
#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字符串的所有权 - 有两个选项。
在第一种情况下你需要这样做:(我假设一个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());
答案 1 :(得分:0)
您的代码应为
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*
返回,因为一旦函数退出,内存将被销毁。
答案 2 :(得分:0)
问题已解决(为什么?:P)
string prawniczek=choosenick();
int TempNumOne=prawniczek.size();
char niczek[40];
for (int a=0;a<=TempNumOne;a++)
{
niczek[a]=prawniczek[a];
}
ok问题通过逐个重写字符索引位置逐个解决
它必须意味着 strncpy与nickname.c_str()的工作方式不同。
无论如何 - 我认为这种方式并不优雅,即使它有效
有没有人知道如何以正确的方式做到这一点?
更新: 此外: 当循环在main中从choosenick()方法转换为char数组时它完美地工作,但是当我在方法choosenick()中执行它并将转换后的循环结果返回到main时它不起作用