[英]Passing 2d Arrays by Reference in C
我已经搜索和阅读了一段时间,我看不到为什么这行不通。
我正在使用&
传递2d数组&
以传递内存中第一个位置的地址。 该函数接受一个char *tokens
指向该内存位置的指针。
功能:
void printOutput( FILE* template, char* tokens)
{
char c = fgetc(template);
while(c != EOF )
{
if( c != '$' )
{
printf("%c", c);
}
else
{
c = fgetc(template);
int charVal = c-'0';
if( charVal >= 0 && charVal <= 9 )
{
printf("%d" , charVal);
printf("%s" , tokens[charVal]);
}
}
c = fgetc(template);
}
printf("\n\n");
}
该函数的调用方式如下:
printOutput(template, &tokens[0]);
如果我将函数代码代替printOutput
函数调用放入主函数中,则输出将正确显示。
据我所知,在函数调用和函数运行之间的某个地方发生了某种事情,这使我的tokens[][]
变成了all (null)
数组。
我相信我的解决方法有误,希望有人能提供帮助。 如果需要,我还可以提供更多代码。
我非常感谢您的帮助!
由于答案有所帮助,但仍不能解决问题,因此我求助于从代码中添加main()
函数。
int main( int argc, char *argv[] )
{
FILE *template = NULL;
FILE *data = NULL;
char input[INPUT_LENGTH];
template = fopen( "template.txt", "r" );
if ( template != NULL )
{
data = fopen( "data.txt", "r" );
if ( data != NULL )
{
char input[INPUT_LENGTH];
while ( fgets(input, INPUT_LENGTH, data) )
{
char *token = NULL;
char *tokens[INPUT_LENGTH][FIELD_LENGTH];
int pos = 0;
token = strtok(input, "|");
while(token != NULL )
{
tokens[pos][0] = token;
token = strtok(NULL, "|");
pos++;
}
printOutput(template, tokens[INPUT_LENGTH][FIELD_LENGTH]);
rewind(template);
}
fclose( data );
}
fclose( template );
}
return EXIT_SUCCESS;
}
我现在只能假设问题与char *tokens[INPUT_LENGTH][FIELD_LENGTH];
声明,但我现在不确定。
您的2D数组char tokens[X][LEN]
在内存中的布局方式为:
Value : Mem addresses for char[LEN]
tokens[0] : 0 . . . LEN-1
tokens[1] : LEN . . . 2*LEN-1
tokens[X-1] : (X-1)*LEN . . . X*LEN - 1
相反, char* tokens
被解释为:
Value : Mem addresses for char
tokens[0] : 0
tokens[1] : 1
tokens[2] : 2
现在,当您将它们以字符串格式传递给printf
时,您是在将值取消引用给char
,而不是像期望的char*
那样。 因此输出不良/行为不确定。
即使您使用了该地址( printf("%s" , &tokens[charVal]);
),也仍然无法获得预期的结果,因为它解析为错误的地址。
由于2D数组的大小是固定的,因此应声明以下函数:
void printOutput( FILE* template, char tokens[X][LEN] )
X
和LEN
是两个数组的维数,显然...万一我在上面大量使用它们后还不清楚,
这样,编译器确切地知道如何解释tokens[charVal]
,它们将是一个衰减为char*
的数组类型。
[编辑,因为您提供了更多信息和代码]
您仍然对数组的char*
和char
之间感到困惑。 我已经更正了这一点,因为tokens
应该是char*
的一维数组。
char *tokens[INPUT_LENGTH] = { 0 };
int pos = 0;
token = strtok(input, "|");
while(token != NULL )
{
tokens[pos] = token;
token = strtok(NULL, "|");
pos++;
}
printOutput(template, tokens);
另外, printOutput
应该定义为:
void printOutput( FILE* template, char** tokens)
从以下printOutput()中的以下printf语句中,我相信您正在尝试访问令牌,就好像它是字符串数组一样。 printf(“%s”,tokens [charVal]);
但是,您已经将标记声明为printOutput()中的一个char指针,该指针最多只能代表一个字符数组(或者,如果以null终止,则只能是1个字符串)。
您需要将其声明为二维数组
void printOutput (FILE* template, char tokens[MAX_STRINGS] [MAX_CHARS_IN_STRING])
或将其声明为指向字符数组的指针
void printOutput (FILE* template, char (*tokens) [MAX_CHARS_IN_STRING])
并称其为
printOutput(template, tokens);
您将令牌作为“ char *”传递,但是,您要尝试的是传递“ char **”,即指向2D数组第一个元素的指针的指针。
尝试这个:
void printOutput( FILE* template, char** tokens)
并如下调用:
printOutput(template, tokens);
请注意,您希望令牌中的所有“ char *”都具有“ \\ 0”终止符。
例如tokens [0] = {'a','b','c','\\ 0'}或tokens [0] =“ abc”,因为printf不知道从何处停止打印'%s'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.