gpt4 book ai didi

c - 定义一个 C 函数,该函数采用带有维度大小变量的二维数组

转载 作者:行者123 更新时间:2023-12-04 00:48:59 27 4
gpt4 key购买 nike

编辑:原来我使用的编译器不支持可变长度数组,所以我无法使用 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);对于第二个例子

最佳答案

如果您的编译器支持可变长度数组,则可以按照以下方式声明和定义函数,如下面的演示程序所示。请注意,并非所有编译器都支持可变长度数组(尤其是 MSVC),在这种情况下无法获得所需的符号。

#include <stdio.h>
#include <string.h>

size_t findStringIndex( size_t m, size_t n, char a[m][n], const char *s )
{
size_t i = 0;

while ( i < m && !( strcmp( a[i], s ) == 0 ) ) ++i;

return i;
}

int main(void)
{
enum { M1 = 3, N1 = 10 };

char a1[M1][N1] =
{
"Hello", "World", "Everybody"
};

const char *s = "Hello";

size_t pos = findStringIndex( M1, N1, a1, s );

if ( pos != M1 )
{
printf( "\"%s\" is found at position %zu.\n", s, pos );
}
else
{
printf( "\"%s\" is not found.\n", s );
}

s = "World";

pos = findStringIndex( M1, N1, a1, s );

if ( pos != M1 )
{
printf( "\"%s\" is found at position %zu.\n", s, pos );
}
else
{
printf( "\"%s\" is not found.\n", s );
}

s = "Everybody";

pos = findStringIndex( M1, N1, a1, s );

if ( pos != M1 )
{
printf( "\"%s\" is found at position %zu.\n", s, pos );
}
else
{
printf( "\"%s\" is not found.\n", s );
}

s = "Bye";

pos = findStringIndex( M1, N1, a1, s );

if ( pos != M1 )
{
printf( "\"%s\" is found at position %zu.\n", s, pos );
}
else
{
printf( "\"%s\" is not found.\n", s );
}

return 0;
}

程序输出为

"Hello" is found at position 0.
"World" is found at position 1.
"Everybody" is found at position 2.
"Bye" is not found.

关于c - 定义一个 C 函数,该函数采用带有维度大小变量的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68201773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com