如何在for循环中依次访问c风格的字符串变量
How to access c style string variables sequentially in for loop
我有一长串很好的老式c风格字符串:
const char * p1key = PROPERTY_MAX_THREADS;
const char * p1value = "12";
const char * p2key = PROPERTY_MAX_FRAMES;
const char * p2value = "400";
const char * p3key = PROPERTY_MAX_FRAMEMEMORY;
const char * p3value = "140";
...
然后我对它们做一些事情:
// write p1, p2, p3, pn to disk in fancy format
最后,我希望能够编写一个循环,并将写入的值与原始值进行比较。
int numProperties = 20;
for (int i = 0; i < numProperties; ++i) {
// on the first iteration, access p1 key/value
// on the second, access p2 key/value
// ...
}
如何在第一次迭代时访问p1,在第二次迭代时访问p2,等等?指针数组会有帮助吗?我正在努力想出让这个工作的语法。任何帮助都会非常感激。
编辑:
我认为最好的答案是同时显示C和c++的方式
介绍
您必须将指针存储在某种容器中,以便能够按照您建议的方式对它们进行迭代。
由于您处理的是成对,<utility>
中的std::pair
似乎是完美匹配的。将这些std::pair
封装在容器中,例如std::vector
,将使以一种干净的方式迭代它们变得非常容易。
<
示例实现/strong>
#include <iostream>
#include <utility>
#include <vector>
<一口> 一口>
#define PROPERTY_MAX_THREADS "max_threads"
#define PROPERTY_MAX_FRAMES "max_frames"
#define PROPERTY_MAX_FRAMEMEMORY "max_fmemory"
const char * p1key = PROPERTY_MAX_THREADS;
const char * p1value = "12";
const char * p2key = PROPERTY_MAX_FRAMES;
const char * p2value = "400";
const char * p3key = PROPERTY_MAX_FRAMEMEMORY;
const char * p3value = "140";
<一口> 一口>
int
main (int argc, char *argv[])
{
std::vector<std::pair<char const *, char const *>> properties {
{ p1key, p1value }, { p2key, p2value }, { p3key, p3value }
};
std::cout << "properties:n";
for (auto& it : properties) {
std::cout << " " << it.first << " = " << it.second << "n";
}
}
<一口> 一口>
properties:
max_threads = 12
max_frames = 400
max_fmemory = 140
我试了上面的但是它不能编译,为什么?
前面编写的代码片段使用了c++ 11中引入的特性,如果您无法编译这些代码,则需要使用编译器提供的功能。
下面是一个修改后的实现,可以被任何支持c++ 03的编译器编译:
int const PROPERTIES_LEN = 3;
std::pair<char const *, char const*> properties[PROPERTIES_LEN] = {
std::make_pair (p1key, p1value),
std::make_pair (p2key, p2value),
std::make_pair (p3key, p3value)
};
for (int i = 0; i < PROPERTIES_LEN; ++i) {
std::cout << properties[i].first << " = " << properties[i].second << "n";
}
你标记了c++,所以我将给出c++的建议。
#include <iostream>
#include <vector>
#include <utility>
#define PROPERTY_MAX_THREADS "1"
#define PROPERTY_MAX_FRAMES "2"
#define PROPERTY_MAX_FRAMEMEMORY "3"
const char * p1key = PROPERTY_MAX_THREADS;
const char * p1value = "12";
const char * p2key = PROPERTY_MAX_FRAMES;
const char * p2value = "400";
const char * p3key = PROPERTY_MAX_FRAMEMEMORY;
const char * p3value = "140";
int main() {
using namespace std;
vector<pair<const char*,const char *>> collection =
{{p1key,p1value},{p2key,p2value},{p3key,p3value}};
for(auto &ele : collection){
cout << "key:" << ele.first
<< "value:" << ele.second << endl;
}
return 0;
}
或者直接从一开始就声明为一个集合
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#define PROPERTY_MAX_THREADS "1"
#define PROPERTY_MAX_FRAMES "2"
#define PROPERTY_MAX_FRAMEMEMORY "3"
int main() {
using namespace std;
vector<pair<const string,const string>> collection =
{
{PROPERTY_MAX_THREADS, "12" },
{PROPERTY_MAX_FRAMES, "400"},
{PROPERTY_MAX_FRAMEMEMORY, "140"}
};
for(auto &ele : collection){
cout << "key:" << ele.first
<< " value:" << ele.second << endl;
}
return 0;
}
在C语言中可以这样做。
#define STRA_END 0
const char* keyArray[] = {
"string1",
"string2",
"string3",
STRA_END
}
const char* valueArray[] = {
"string1",
"string2",
"string3",
STRA_END
}
main(){
int i;
for( i=0; keyArray[i]!=0; ++i )
doSometingToString(keyArray[i], valueArray[i]);
}
相关文章:
- 通过方法访问结构
- Qt VTK交互风格的信号到小部件
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 尝试使用std::functional和std::bind在C++中创建C#风格的事件访问修饰符
- 以numpy/Python的风格访问OpenCV和C++中的矩阵元素
- Scala中C++风格的私有访问
- C++继承和受保护基类成员的访问:用Java风格做这件事是个坏主意吗
- 如何在for循环中依次访问c风格的字符串变量