将const char转换为char时出现未处理的异常

时间:2013-08-05 09:29:39

标签: c++ strcat

过去30分钟,我一直在尝试将const char转换为char。 这就是我所拥有的。

 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'作为我唯一的参数。

4 个答案:

答案 0 :(得分:8)

尝试使用C ++而不是C语言:

std::vector<char> data(atr.begin(), atr.end());
data.push_back('\0');
parseargs(&data[0]);

答案 1 :(得分:5)

您的代码有两个问题。首先你 使用字符串文字初始化char*。这用 弃用的转换;字符串文字的类型为char const[](转换为char const*,而不是char*), 因为任何修改文字的尝试都是未定义的行为。 第二个是你的字符串文字只有一个char长, 所以,即使你可以写信,除非atr为空,否则你就是 写在缓冲区的末尾。

您没有告诉我们parseargs的任何信息。如果没有 修改它的参数,你可以传递它atr.c_str(),然后 完成它。 (如果它是忽略const的遗留函数, 你可能必须在这里使用const_cast。)如果确实修改了它 参数(因为它使用strtok),然后你必须这样做 明确地将'\0'推送到atr的末尾,然后传递它 &atr[0]。 (不是特别干净的解决方案,但如果你是 之后不使用atr,它应该有用。)

答案 2 :(得分:4)

buffbuffA的内容都在进程的只读内存中 您实际上需要new buff喜欢

char* buff = new char[32];

这会从免费商店提供内存,然后您可以strcatbuffAbuff的字符串。 您应该更喜欢strncat,但最好避免缓冲区溢出,最后delete {/ 1}}。

答案 3 :(得分:2)

char *buff = ""; // Create a new char to hold the converted result.

创建一个char *,指向(可能是只读的)内存中大约1个字节的内存。这样:

 strcat(buff,buffA); // Do the conversion.

尝试使用任意字符串覆盖1个左右字节的(可能只读)内存。

这可能会立即崩溃。如果内存是只读的,它将立即崩溃。如果内存不是只读的,它会踩踏随机数据,导致非常不确定的行为。

为什么你想这样做? parseArgs实际上需要一个可修改的字符串吗?它是解析参数,它不需要改变它们。如果确实有必要,请使用std::vector<char>并传递第一个元素的地址,并希望它所做的只是戳戳数组的内容,而不是(比如说)在结束时运行。