Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将常量字符转换为字符时发生未处理的异常_C++_Strcat - Fatal编程技术网

C++ 将常量字符转换为字符时发生未处理的异常

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 = ""; //

在过去的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 = ""; // 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)。字符串肯定更容易操作