编辑:事实证明,我使用的编译器不支持变长数组,所以我无法在 MSVC 中实现我想要的表示法。
我有一个函数,它接收一个字符串数组和一个查询字符串,并返回匹配查询的数组中字符串的索引。
int findStringIndex(char query[], int strLength, char* strArray, int numStrings) {
for (int i = 0; i < numStrings; i++) {
for (int j = 0; j < strLength; j++) {
// Skip to next word if there is a mismatch
if (query[j] != *(strArray+ (i * strLength) + j))
break;
if (query[j] == '\0' && *(strArray + (i * strLength) + j) == '\0')
return i;
}
}
return -1;
}
值得注意的是,字符串的长度和数组的大小都不同,因为我在多个不同大小的字符串中使用此函数。目前,这种方法存在两个问题:
- 丑陋的数组访问符号
*(strArray+ (i * strLength) + j))
而不是像strArray[i][j]
这样的符号 - 当我调用函数并将字符串数组作为第三个参数传递时,我会收到警告,即我传递的参数与char* "具有不同的间接级别"
有没有办法告诉编译器接受一个变量作为数组轴的大小,以便我可以使用符号strArray[i][j]
?
另外,我应该如何定义函数,以避免出现"间接级别"的警告?
编辑:澄清一下,字符串数组不是不规则的。它们具有常量大小的维度,但我想在不同大小的数组上使用该函数。代码在当前状态下可以正常运行并实现所需的行为,我只是想确保我正在正确编写。
以下是我可能使用此函数的两个示例(不同的字符串大小):
char instructionStrings[NUM_INSTRUCTIONS][INST_MAX_CHARS] = {
"nop", "lit", "litn", "copy", "copyl", "asni", /* etc */
};
char typeStrings[NUM_TYPES][TYPE_MAX_CHARS] = {
"null", "int8", "int16", "int32", "int", "real32", "real"
};
其中INST_MAX_CHARS和TYPE_MAX_CHARS是不同的值。那么我将像第二个例子一样调用函数:findStringIndex(userInput,TYPE_MAX_CHARS,typeStrings,NUM_TYPES);
STR_ARRAY(size, i, j)
等类似名称调用呢? - Jardel Luccachar *
不兼容的内容,因此代码已经出错。 - M.Mchar instructionStrings[NUM_INSTRUCTIONS][INST_MAX_CHARS] = { "nop", "lit", "litn", "copy", "copyl",
等。 - eejakobowskitypeStrings
作为第三个参数传入时,参数的类型是char (*)[TYPE_MAX_CHARS]
,与您在实现中指定的char *
不兼容。大多数人会使用void *
作为函数参数类型,并在函数内部转换为char *
。 - jxhvoid*
。我之前使用char*
是为了尽量暗示所需的输入类型,但由于我使用的编译器无法准确显示参数应该是什么,因此只能使用void*
。 - eejakobowski