如何在for循环中按顺序访问c样式字符串变量

时间:2014-03-24 01:23:09

标签: c++ c

我有一些很好的老式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 ++方式的最佳答案

3 个答案:

答案 0 :(得分:3)

<强>引言

您必须将指针存储在某种容器中,以便能够按照您的建议迭代它们。

由于你正在处理对,std::pair <utility>似乎是一个完美的匹配。将这些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";
  }

答案 1 :(得分:2)

你把它标记为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;
}

答案 2 :(得分:1)

在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]);
}