将控制字符传递给字符数组
Passing control character to char array
这个
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字符串的所有权,并将在稍后释放它。
- 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时,它不起作用
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?