繁体   English   中英

如何在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类的容器中,将很容易以干净的方式遍历它们。


样品实施

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM