>house; house -6ren">
gpt4 book ai didi

c++ - 将控制字符传递给 char 数组

转载 作者:行者123 更新时间:2023-11-27 22:57:25 25 4
gpt4 key购买 nike

这个

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;

即使我在键盘上键入“gain”,我也需要将这个带有控制字符的 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;
}

只是为了表明它确实在做它应该做的事情,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
'

由于您有一个接受 C 字符串的 API,因此您需要检查该 API 的详细信息以了解 C 字符串的所有权 - 有两个选项。

  1. API 获取 C 字符串的所有权,稍后将释放它。
  2. API 制作 C 字符串的拷贝,您可以控制它的生命周期。

在第一种情况下,您需要这样做:(我假设一个 C api,它最终将 释放 传入的指针 - 如果它是一个设计糟糕的 C++ API,它将 delete[] 它,你需要用 new char[nick.size()]

替换 malloc
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());

关于c++ - 将控制字符传递给 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31378250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com