[英]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
类的容器中,将很容易以干净的方式遍历它们。
样品实施
#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]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.