在C中查找2D char数组中的字符串

时间:2015-10-07 03:14:50

标签: c++ arrays multidimensional-array

我试图在2D char数组中找到一个字符串并返回它的索引。例如:

char idTable[255][32];
char tester[] = { 't','e','s','t','e','r','\0' };
memcpy(idTable[43], tester, 7);

uint8_t id = getID(name[0]); 
//name is returned from function "char **name = func();"
//but I have the same results when I try using normal char array...

我已经在下面的代码的第一部分取得了部分成功,但是如果单词的一部分是相同的(one,oneTwo),则找到匹配。如果我添加"否则如果"第一个"如果"如果"它总是进入"否则。

文件的其余部分打印出不同的结果 printf("idTable string lenght:\t %u\n", strlen(idTable[index]));printf("foundMatch string lenght:\t %u\n", strlen(foundMatch)); ,除非我添加printf("Index:\t %i\n", index);

uint8_t getID(char *name) {
  printf("\nInserted name:\t %s\n", name);
  uint8_t index;

  for (uint8_t r = 0; r < 255; r++) {
    if (strstr(idTable[r], name) != NULL) {
      printf("Found '%s' in position:\t %d\n", name, r);
      index = r;
    }
  }


  printf("Index:\t %i\n", index); // THIS LINE

  char foundMatch[strlen(idTable[index])];
  printf("idTable string lenght:\t %u\n", strlen(idTable[index]));

  for (uint8_t c=0; c<strlen(idTable[index]); c++) {
      foundMatch[c] = idTable[index][c];
  }
  printf("foundMatch string lenght:\t %u\n", strlen(foundMatch));

  if (strcmp(foundMatch, nodeName) == 0) {
      printf("Confirmed\n");
      return index;
  } else {
      printf("Second test failed\n");
      return 0;
  }
}

为什么我会得到这种奇怪的结果?有更好的方法吗?

4 个答案:

答案 0 :(得分:1)

我不知道你是如何初始化你的idTable条目的,但是如果你使用的是你在问题开头显示的方法,你就会遇到问题。您不能假设idTable保留的所有空间都初始化为0,因此idTable [43]不是以空字符结尾的字符串。因此,idTable [43]无需比较等于空终止字符串“tester”。

此外,您的getID函数尽管有签名,但不会返回任何内容。所以它甚至不会按原样编译。

答案 1 :(得分:1)

这是实际C ++中的解决方案,而不是C。

std::array<std::string, 255> idTable;
idTable.at(43) = "tester";

std::pair<std::size_t, std::size_t> findInIdTable(std::string const& what) {
    for (unsigned i = 0; i < idTable.size(); ++i) {
        std::size_t pos = idTable.at(i).find(what);
        if (pos != std::string::npos) {
            return std::make_pair(i, pos);
        }
    }
    // if the code reaches this place, it means "not found". Choose how you want to deal with it
    // my personal suggestion would be to return std::optional<std::pair<...> instead.
}

如果您想放弃pos值,也很容易更改。

Live On Coliru

答案 2 :(得分:1)

在类别中:使用C ++

  

当然,如果可能,请使用std::array<char, 32>std::string。我坚持你对这个答案的选择:

<强> Live On Coliru

#include <algorithm>
#include <iostream>
#include <cstring>

char idTable[255][32] = { };

int main() {
    using namespace std;
    // initialize an entry
    copy_n("tester", 7, idTable[43]);

    // find match
    auto match = [](const char* a) { return strcmp(a, "tester") == 0; };
    auto index = find_if(begin(idTable), end(idTable), match) - idTable;

    // print result
    cout << "match at: " << index;
}

打印

match at: 43

答案 3 :(得分:-1)

在idTable行中复制后,您需要在foundMatch数组的末尾添加一个nul:

foundMatch[strlen(idTable[index])] = '\0';

在'foundMatch string lenght'(长度)消息之前。

strlen是一个昂贵的函数,每次都会遍历字符串。您应该调用一次,将其存储在局部变量中,然后引用该变量,而不是反复调用strlen