将控制字符传递给char数组

时间:2015-07-13 08:06:06

标签: c++ arrays control-characters

这一个

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;

3 个答案:

答案 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字符串的所有权 - 有两个选项。

  1. API获取C字符串的所有权,稍后将取消分配。
  2. API会复制C字符串,并控制其生命周期。
  3. 在第一种情况下你需要这样做:(我假设一个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时它不起作用