1

在过去的 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

4 回答 4

8

尝试使用 C++ 而不是 C 习惯用法:

std::vector<char> data(atr.begin(), atr.end());
data.push_back('\0');
parseargs(&data[0]);
于 2013-08-05T09:31:51.953 回答
5

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

你没有告诉我们任何关于parseargs. 如果它不修改它的参数,你可以通过它atr.c_str(),并完成它。(如果它是一个忽略 const 的遗留函数,您可能必须在const_cast此处使用 a。)如果它确实修改了它的参数(比如因为它使用strtok),那么您必须显式地将 a 推'\0'到 的末尾atr,然后传递它 &atr[0]. (不是一个特别干净的解决方案,但如果您atr之后不使用,它应该可以工作。)

于 2013-08-05T09:37:59.830 回答
4

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

char* buff = new char[32];

这提供了来自 free-store 的内存,然后您可以strcat将字符串 from buffAto buff。您应该更喜欢strncat,但要避免缓冲区溢出和最终。deletebuff

于 2013-08-05T09:31:32.067 回答
2

这个

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

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

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

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

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

你到底为什么要这么做?parseArgs真的需要一个可修改的字符串吗?它正在解析参数,不需要更改它们。如果确实有必要,请使用 astd::vector<char>并传递第一个元素的地址,并希望它所做的只是戳数组的内容,而不是(比如说)跑到最后。

于 2013-08-05T09:36:02.960 回答