Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用指针返回2D数组函数?_C_Arrays_Function_Pointers_Multidimensional Array - Fatal编程技术网

C 如何使用指针返回2D数组函数?

C 如何使用指针返回2D数组函数?,c,arrays,function,pointers,multidimensional-array,C,Arrays,Function,Pointers,Multidimensional Array,因此,我有一个名为scanCode的函数,它扫描文本文件中的单词并将其存储在二维数组中。然后我想将这个数组返回到main函数中的数组变量中,这是我到目前为止的代码 #include <stdio.h> char **scanCode() { FILE *in_file; int i = 0; static char scan[9054][6]; in_file = fopen("message.txt", "r"); while (!feo

因此,我有一个名为
scanCode
的函数,它扫描文本文件中的单词并将其存储在二维数组中。然后我想将这个数组返回到main函数中的数组变量中,这是我到目前为止的代码

#include <stdio.h>

char **scanCode()
{
    FILE *in_file;
    int i = 0;
    static char scan[9054][6];

    in_file = fopen("message.txt", "r");
    while (!feof(in_file))
    {

        fscanf(in_file, "%s", scan[i]);
        i++;
    }
    return scan;
}

int main(void)
{

    int hi[9053];

    FILE *in_file;

    in_file = fopen("message.txt", "r");

    char **array = scanCode();

    printf("%c", array[0]);
    printf("%c", array[1]);
    printf("%c", array[2]);
    printf("%c", array[3]);
}
#包括
字符**扫描码()
{
文件*在_文件中;
int i=0;
静态字符扫描[9054][6];
in_file=fopen(“message.txt”、“r”);
而(!feof(在文件中))
{
fscanf(在_文件中,“%s”,扫描[i]);
i++;
}
返回扫描;
}
内部主(空)
{
int hi[9053];
文件*在_文件中;
in_file=fopen(“message.txt”、“r”);
字符**数组=扫描码();
printf(“%c”,数组[0]);
printf(“%c”,数组[1]);
printf(“%c”,数组[2]);
printf(“%c”,数组[3]);
}

所以基本上是从
scanCode
函数返回的数组,我希望它存储在main函数的char数组中。。在这里看了很多问题和答案后,这是我得到的,但指针等对我来说很难理解。。有人能告诉我这里做错了什么吗?

用以下方法更改函数的返回类型

#include <stdio.h>

char ( *scanCode() )[6]
{
    FILE *in_file;
    int i = 0;
    static char scan[9054][6];

    in_file = fopen("message.txt", "r");
    while (!feof(in_file))
    {

        fscanf(in_file, "%s", scan[i]);
        i++;
    }
    return scan;
}

int main(void)
{

    int hi[9053];

    FILE *in_file;

    in_file = fopen("message.txt", "r");

    char ( *array )[6] = scanCode();

    printf("%s", array[0]);
    printf("%s", array[1]);
    printf("%s", array[2]);
    printf("%s", array[3]);
}

我更喜欢用以下方式简化代码:

#包括
#定义NumLines 9054
#定义NumCols 6
无效自由内存(字符**ele){
while(*ele!=NULL){
免费(*ele);
ele++;
}
}
字符**扫描代码(字符*文件名)
{
文件*在_文件中;
字符读取格式[128];
int i=0;
/*
*相反,为了声明一个静态变量,我更喜欢动态分配
*二维数组。
*分两步完成:
*1.为第一个维度分配内存
*2.对于此维度中的每个元素,为第二维度中的每个元素分配内存
*
*/
字符**扫描=(字符**)malloc((NumLines+1)*sizeof(字符*);
如果(扫描==NULL){
返回NULL;
}
对于(int j=0;j
数组不是指针(我再次向您问好)

这:

有一个最明显的类型,你希望它是“char[9054][6]”,而不是“char**”。它被拼写为一个包含6个元素的数组,每个元素都是另一个包含9054个字符的数组。另一方面,“char**”类型拼写为“指向char的指针”,正如您现在可能看到的,它们是完全不同的东西

您的代码应该如下所示:

#include <stdio.h>

typedef char yourArrayType[9054][6];

typedef struct { yourArrayType return_value; } letsReturnArraysType;

letsReturnArraysType scanCode()
{
    FILE *in_file;
    int i = 0;
    yourArrayType scan;

    in_file = fopen("message.txt", "r");
    while (!feof(in_file))
    {

        fscanf(in_file, "%s", scan[i]);
        i++;
    }
    return *(letsReturnArraysType*)scan;
}

int main(void)
{

    int hi[9053];

    FILE *in_file;

    in_file = fopen("message.txt", "r");

    letsReturnArraysType arrayStruct = scanCode();

    printf("%s", arrayStruct.return_value[0]);
    printf("%s", arrayStruct.return_value[1]);
    printf("%s", arrayStruct.return_value[2]);
    printf("%s", arrayStruct.return_value[3]);
}
#包括
typedef char yourraytype[9054][6];
typedef结构{yourArrayType返回值;}LetsReturnArrayType;
LetsReturnArrayStypeScanCode()
{
文件*在_文件中;
int i=0;
你的阵列类型扫描;
in_file=fopen(“message.txt”、“r”);
而(!feof(在文件中))
{
fscanf(在_文件中,“%s”,扫描[i]);
i++;
}
返回*(letsReturnArraysType*)扫描;
}
内部主(空)
{
int hi[9053];
文件*在_文件中;
in_file=fopen(“message.txt”、“r”);
LetsReturnArrayStypeArrayStruct=scanCode();
printf(“%s”,arrayStruct.return_值[0]);
printf(“%s”,arrayStruct.return_值[1]);
printf(“%s”,arrayStruct.return_值[2]);
printf(“%s”,arrayStruct.return_值[3]);
}

为什么要使用
%c
打印字符串,
数组[n]
?当我放置%s时,cmd run窗口冻结,因此数组有一些问题另一点:
而(!feof(in_file))
在文件结束前读取是一种不好的方式
feof
仅在尝试读取文件末尾以外的内容时才为真,因此,在读取文件的最后一行之后,您的代码将尝试额外的
fscanf
,并且在扫描数组的末尾将有一个伪条目。请参阅。@Lowerer OP在以前的回答中有3个回复是不使用
while(feof())…
也许这第四个问题可以解决问题。请注意,您已经发布了10个问题,但没有接受任何问题。建议在一个答案很好地回答了这篇文章后进行复查,接受它是一种很好的礼仪。我个人更喜欢将文件名作为参数传递。您应该去掉神奇的数字(9054?)并直接检查scanf()而不是foef()。这是一个明智的方法(+1),尽管我可能只是使用
malloc(6)
来代替
malloc(6*sizeof(char))
,因为
sizeof(char)
是很好理解的(这是我通常明确表示
sizeof
的唯一例外)。此外,我知道在这种情况下,由于
main
刚刚退出,因此值得注意的是,
scanCode()
的调用方需要负责在不再需要返回指针时释放返回指针的内存。我也同意@Bob_uuuf.
fscanf(在_文件中,“%s”,scan[I])建议的改进和<代码>(Sc[i])<代码>一样安全。考虑增加对输入长度的限制。我当然不认为这是最好的主意。你应该尽量避免使用“Maloc”。@ FISCOPP为什么应该尽可能避免<代码> MALLC/<代码>?当你超出范围时?@Bob_uuuu我什么都不想。你有其他意见吗?@Bob_uuuu因为它声明为
静态
,它的内容在
扫描代码
函数的范围之外可用。我错过了静态,我的错。不,因为我返回了整个数组。我明白了。但不是
static char scan[9054][6];
#include <stdio.h>

typedef char yourArrayType[9054][6];

typedef struct { yourArrayType return_value; } letsReturnArraysType;

letsReturnArraysType scanCode()
{
    FILE *in_file;
    int i = 0;
    yourArrayType scan;

    in_file = fopen("message.txt", "r");
    while (!feof(in_file))
    {

        fscanf(in_file, "%s", scan[i]);
        i++;
    }
    return *(letsReturnArraysType*)scan;
}

int main(void)
{

    int hi[9053];

    FILE *in_file;

    in_file = fopen("message.txt", "r");

    letsReturnArraysType arrayStruct = scanCode();

    printf("%s", arrayStruct.return_value[0]);
    printf("%s", arrayStruct.return_value[1]);
    printf("%s", arrayStruct.return_value[2]);
    printf("%s", arrayStruct.return_value[3]);
}