如何在for循环中依次访问c风格的字符串变量

How to access c style string variables sequentially in for loop

本文关键字:访问 风格 变量 字符串 for 循环      更新时间:2023-10-16

我有一长串很好的老式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]);
}