繁体   English   中英

在C中通过引用传递2d数组

[英]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] )

XLEN是两个数组的维数,显然...万一我在上面大量使用它们后还不清楚,

这样,编译器确切地知道如何解释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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM