簡體   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