我试图在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;
}
}
为什么我会得到这种奇怪的结果?有更好的方法吗?
答案 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
值,也很容易更改。
答案 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
。