C++ 将常量字符转换为字符时发生未处理的异常
在过去的30分钟里,我一直在尝试将常量字符转换为字符。 这是我得到的C++ 将常量字符转换为字符时发生未处理的异常,c++,strcat,C++,Strcat,在过去的30分钟里,我一直在尝试将常量字符转换为字符。 这是我得到的 string atr; getline(cin,atr); // Start off with a string because getline takes nothing else. const char *buffA = atr.c_str(); // Create a const char of the string converted to a const char. char *buff = ""; //
string atr;
getline(cin,atr); // Start off with a string because getline takes nothing else.
const char *buffA = atr.c_str(); // Create a const char of the string converted to a const char.
char *buff = ""; // Create a new char to hold the converted result.
strcat(buff,buffA); // Do the conversion.
parseargs(buff); // Pass the data on.
但是,我得到一个未处理的异常。我不知道为什么。我只是在控制台中输入了“try”作为我唯一的参数。您的
buff
和buff
的内容都在进程的只读内存中。您实际上需要
new
您的buff
像
char* buff = new char[32];
这将提供免费存储的内存,然后您可以strcat
从buff
到buff
的字符串。
您应该更喜欢
strncat
,但要避免缓冲区溢出,并最终删除您的buff
。buff
和buff
的内容都在进程的只读内存中。您实际上需要
new
您的buff
像
char* buff = new char[32];
这将提供免费存储的内存,然后您可以strcat
从buff
到buff
的字符串。
您应该更喜欢<代码> STRCATA< /COD>,但是为了避免缓冲区溢出和<代码>删除<代码>您的<代码> buff > .< /p> 尝试使用C++代替C习惯用法:
std::vector<char> data(atr.begin(), atr.end());
data.push_back('\0');
parseargs(&data[0]);
std::向量数据(atr.begin(),atr.end());
数据。推回('\0');
解析参数(&数据[0]);
<代码> > P>尝试使用C++代替C语言:
std::vector<char> data(atr.begin(), atr.end());
data.push_back('\0');
parseargs(&data[0]);
std::向量数据(atr.begin(),atr.end());
数据。推回('\0');
解析参数(&数据[0]);
这个
创建一个char*
,该字符指向(可能是只读的)范围约为1字节的内存。这:
strcat(buff,buffA); // Do the conversion.
试图用任意字符串覆盖大约1字节的内存(可能是只读的)
很有可能这会迅速崩溃。如果内存是只读的,它将立即崩溃。如果内存不是只读的,它将践踏随机数据,导致非常不确定的行为
你到底为什么要那样做?parseArgs
确实需要一个可修改的字符串吗?这是解析参数,不需要更改它们。如果确实有必要,使用std::vector传递第一个元素的地址,并希望它所做的只是插入数组的内容,而不是(比如)在数组末尾运行。
创建一个char*
,该字符指向(可能是只读的)范围约为1字节的内存。这:
strcat(buff,buffA); // Do the conversion.
试图用任意字符串覆盖大约1字节的内存(可能是只读的)
很有可能这会迅速崩溃。如果内存是只读的,它将立即崩溃。如果内存不是只读的,它将践踏随机数据,导致非常不确定的行为
你到底为什么要那样做?parseArgs
确实需要一个可修改的字符串吗?这是解析参数,不需要更改它们。如果确实有必要,使用std::vector传递第一个元素的地址,并希望它所做的只是插入数组的内容,而不是(比如)在数组的末尾运行。您的代码有两个问题。首先,你
使用字符串文本初始化char*
。这使用
不赞成的兑换;字符串文本的类型是char
常量[]
(转换为字符常量*
,而不是字符*
),
因为任何修改文字的尝试都是未定义的行为。
第二个是字符串文字只有一个char
long,
因此,即使您可以对其进行写入,除非atr
为空,否则您将
在缓冲区结尾之外写入
您没有告诉我们有关parseargs
的任何信息。如果没有
修改它的参数,您只需传递它atr.c_str()
,然后
完了。(如果是忽略常量的遗留函数,
您可能必须在此处使用const_cast
),如果它确实修改了
参数(比如说因为它使用了strtok
),那么您必须
显式地将'\0'
推到atr
的末尾,然后传递它
&atr[0]
。(不是特别干净的解决方案,但如果您
以后不要使用atr,它应该会起作用。)你的代码有两个问题。首先,你 使用字符串文本初始化
char*
。这使用
不赞成的兑换;字符串文本的类型是char
常量[]
(转换为字符常量*
,而不是字符*
),
因为任何修改文字的尝试都是未定义的行为。
第二个是字符串文字只有一个char
long,
因此,即使您可以对其进行写入,除非atr
为空,否则您将
在缓冲区结尾之外写入
您没有告诉我们有关parseargs
的任何信息。如果没有
修改它的参数,您只需传递它atr.c_str()
,然后
完了。(如果是忽略常量的遗留函数,
您可能必须在此处使用const_cast
),如果它确实修改了
参数(比如说因为它使用了strtok),那么您必须
显式地将'\0'
推到atr
的末尾,然后传递它
&atr[0]
。(不是特别干净的解决方案,但如果您
之后不使用atr,应该可以了。)“我一直在尝试将常量字符转换为字符”不,不,不,不要这样。告诉我们您正在尝试做什么,您认为可以通过将常量字符转换为字符来完成。描述你的问题,不仅仅是你的解决方案。但是为什么你不直接使用<代码>字符串< />代码?我建议你拿起,这样你就可以学习一些现代的C++技术,使你的代码更加容易理解、简洁和安全。正如您从中看到的,您的代码可以用更少的行重写,并且实际工作。@Daaksin:@Daaksin但这不是您已经在做的吗<代码>getline(cin、atr)代码>。字符串肯定更容易操作