过去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'作为我唯一的参数。
答案 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)
buff
和buffA
的内容都在进程的只读内存中
您实际上需要new
buff
喜欢
char* buff = new char[32];
这会从免费商店提供内存,然后您可以strcat
从buffA
到buff
的字符串。
您应该更喜欢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>
并传递第一个元素的地址,并希望它所做的只是戳戳数组的内容,而不是(比如说)在结束时运行。