将控制字符传递给字符数组

Passing control character to char array

本文关键字:字符 数组 控制字符      更新时间:2023-10-16

这个

char *house2="JAM gainrn"

与此不同:

string house, prefix="JAM ", suffix="rn";
cin>>house;
house = prefix + nickname + suffix;
char house2[100];
strncpy(house2, house.c_str(), sizeof(house));
return house2;

即使我在键盘上键入"增益",我需要将这个char数组与控制字符传递给api,因为没有它们,它似乎不起作用。我能做些什么来解决这个问题?

Ok实际代码:

string nickname, prefix="NICK ", suffix="rn";
cout<<"Choose nicknamen";
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());

但是即使这样你也会打开buffer-overflow,所以你真的想要

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

下一个问题是nick是本地的功能,所以返回它将"导致不好的事情"。您可以将其设置为静态(然后稍后会遇到线程的复杂问题……),或者您可以将其作为参数传递(这意味着由于技术原因,您不能使用sizeof)。你真正需要的是简单得多的东西——只返回字符串,而不是C字符串。

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

为了显示它确实在做它应该做的事情,这里有一个在线版本。下面是它的完整代码:

#include <iostream>
#include <string>
std::string getNick() {
    std::string nickname, prefix="NICK ", suffix="rn";
    std::cout<<"Choose nicknamen";
    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字符串的所有权——有两种选择。

    API获得C字符串的所有权,并将在稍后释放它。
  1. API复制C字符串,你可以控制它的生命周期。

在第一种情况下,你需要这样做:(我假设一个C api,它最终将free传入指针-如果它是一个设计糟糕的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());

你的代码应该是

string house, prefix="JAM ", suffix="rn";
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];
    }

ok问题通过简单地逐个重写索引位置的字符来解决

一定是这个意思Strncpy with nickname.c_str()的工作方式不同。

anyway——我认为这种方式并不优雅,尽管它可以工作

有谁知道怎么用正确的方法做吗?

更新:此外:当循环在main中从choosenick()方法转换为char数组时,它工作得很好,但是当我在方法choosenick()中执行并将转换后的循环结果返回给main时,它不起作用