c++ - 为指向 const 的指针赋值 指向 const char 的指针 (const char * const * p)
问题描述
我是 C++ 新手,正在努力使以下代码工作:
struct Keywords
{
const char* const* keys;
int count;
}
Keywords GetKeywords()
{
Keywords keywords;
keywords.count = 10;
string keys = "a b c d e";
keywords.keys = keys???;
return keywords;
}
int main(int argc, char *argv[])
{
Keywords keywords = GetKeywords();
cout<<keywords.count<<endl; //prints 10
cout<<keywords.keys<<endl; //prints a memory address like 0030F838
}
我怎样才能keys
指出a b c d e
?到目前为止,我已经尝试过了
char * writable = new char[keys.size() + 1];
strcpy(writable, keys.c_str());
writable[keys.size()] = '\0';
const char* a = writable;
const char** ptr = &a;
results.keys = ptr;
在调试时我可以看到results.keys
显示a b c d e
,但是一旦GetKeywords()
返回,就results.keys
指向不可读的内存位置。
我无法对方法签名struct Keywords
进行任何更改。GetKeywords()
解决方案
考虑到一些程序员老兄,Miles Budnek和其他人给出的提示,我能够解决问题,如下所述:
在我最初的问题中,键由string keys = "a b c d e";
. 但是在我正在处理的任务中,a b c d e
是通过迭代一个set<string>
项目来构建的。所以这是如何完成的:
struct Keywords
{
const char* const* keys;
int count;
}
Keywords GetKeywords()
{
Keywords keywords;
keywords.count = 5;
set<string> keys;
GetKeys(keys);//returns keys = {"a", "b", "c", "d", "e"}
char** charKeysPtr = new char *[keys.size() + 1];
set<string>::iterator it;
int index = 0;
//Iterate the set and copy each key
for (it = keys.begin(); it != keys.end(); it++)
{
charKeysPtr[index] = new char[it->size() + 1];
strcpy(charKeysPtr[index], it->c_str());
charKeysPtr[index][it->size()] = '\0';
index++;
}
keywords.Keys = charKeysPtr;
return keywords;
}
int main(int argc, char *argv[])
{
Keywords keywords = GetKeywords();
//Print keys
for (int i = 0; i < keywords.count; ++i)
cout << keywords.keys[i] << " ";
//Output is "a b c d e"
//Memory cleanup and etc.
}
感谢你们!
推荐阅读
- php - 我想通过 ajax 在实时复选框选择中获取 PHP POST 中每个复选框的结果
- django - Django中的组Concat
- android - 使用改造调用 api 时,我遇到了 Expected BEGIN_OBJECT 之类的问题,但在第 1 行第 2 列路径 $ 处是 BEGIN_ARRAY
- spring-batch - 是否可以从现有的批处理元数据表中注册作业
- javascript - 从 Bandsintown API 中提取数据
- oracle - 在 Oracle 视图中使用 Select 语句删除字符串
- c++ - 只需打印一次重复的数字/C++
- winapi - MFC CEdit 输入在 4k 分辨率下将文本限制为 10 个字符
- php - PHP 7.2 到 php 7.3 (7.4) 升级碳时区更改
- java - 使用 Antlr4 解析 PlSQL 时如何提取带有语法错误的行