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…中的二维数组;_C_Arrays - Fatal编程技术网

返回C…中的二维数组;

返回C…中的二维数组;,c,arrays,C,Arrays,在C语言中我是个十足的傻瓜。我无法连接这个函数和main。我正试图打印出一个2d数组,但我总是遇到分割错误。任何帮助都将不胜感激 编辑:当我将最后一行“printf(“%d:[%s]\n”,I,*(p+I))”从%s更改为%c时,我得到了正在读取的文件中的第一个单词。事实证明,我的函数实际上返回了一些东西。现在只需要弄清楚如何让它从文件中的其他行返回单词 #include <stdio.h> #include <stdlib.h> #include <string.

在C语言中我是个十足的傻瓜。我无法连接这个函数和main。我正试图打印出一个2d数组,但我总是遇到分割错误。任何帮助都将不胜感激

编辑:当我将最后一行“printf(“%d:[%s]\n”,I,*(p+I))”从%s更改为%c时,我得到了正在读取的文件中的第一个单词。事实证明,我的函数实际上返回了一些东西。现在只需要弄清楚如何让它从文件中的其他行返回单词

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

#define num_strings 20
#define size_strings 20

int *read_file(){
    int j = 0;
    static char text[num_strings][size_strings];

    FILE *fp;
    int x;

    fp = fopen("dictionary2.txt", "r");

    char s[100];
    while(!feof(fp)) {
        x = fscanf(fp,"%[^\n]",s);
        fgetc(fp);

        if (x==1) {
            strcpy(text[j],s);
            j++;
        }
    }
    return text;
}

int main() {
    int *p;
    p = read_file();
    int i;
    for(i = 0; i < 10; i++) {
        printf("%d:[%s]\n",i,*(p+i));
    }
    return(0);
}
#包括
#包括
#包括
#定义num_字符串20
#定义大小\u字符串20
int*read_文件(){
int j=0;
静态字符文本[num_strings][size_strings];
文件*fp;
int x;
fp=fopen(“dictionary2.txt”,“r”);
chars[100];
而(!feof(fp)){
x=fscanf(fp,“%[^\n]”,s);
fgetc(fp);
如果(x==1){
strcpy(文本[j],s);
j++;
}
}
返回文本;
}
int main(){
int*p;
p=读取_文件();
int i;
对于(i=0;i<10;i++){
printf(“%d:[%s]\n”,i,*(p+i));
}
返回(0);
}

更新,哦,我明白了,你将代码从main粘贴到函数,我知道这里发生了什么,你假设p[20][20]与p*或p**相同,这是不正确的,因为现在如果你这样做*(p+1),编译器不知道p中的每个元素都是20宽而不是1宽。这里的方法应该是声明一个指向read_文件中字符串数组的指针,并返回该指针:

static char text[num_strings][size_strings];
static char *texts[num_strings]

...
while....
    ....
       if (x==1)
        {strcpy(text[j],s);texts[j]=text[j];j++;}


return texts;

你的p应该是char*而不是int*。如果已读入20个项目,则还需要终止循环。

通常,您应该在
main()
中创建数组并将其传入,这种行为非常不正常。然而,如果您坚持这样做,您必须返回一个指向数组的指针,因为您不能在C中返回数组

这就是你需要的东西:

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

#define num_strings 20
#define size_strings 20

typedef char (*PARR)[num_strings][size_strings];

PARR read_file(int * wordsread)
{
    static char text[num_strings][size_strings];
    FILE *fp;

    if ( (fp = fopen("dictionary2.txt", "r")) == NULL ) {
        fprintf(stderr, "Couldn't open file for reading\n");
        exit(EXIT_FAILURE);
    }

    char s[100];
    int j = 0;

    while ( j < num_strings && fgets(s, sizeof s, fp) ) {
        const size_t sl = strlen(s);
        if ( s[sl - 1] == '\n' ) {
            s[sl - 1] = 0;
        }

        if ( (strlen(s) + 1) > size_strings ) {
            fprintf(stderr, "String [%s] too long!\n", s);
            exit(EXIT_FAILURE);
        }

        strcpy(text[j++], s);
    }

    fclose(fp);
    *wordsread = j;
    return &text;
}

int main(void)
{
    int wordsread = 0;
    PARR p = read_file(&wordsread);

    for ( int i = 0; i < wordsread; ++i ) {
        printf("%d:[%s]\n", i, (*p)[i]);
    }

    return 0;
}
注意:这仅适用于在
read_file()
中将数组声明为
static
-不要以这种方式返回指向具有自动存储持续时间的局部变量的指针。

尝试将
\define
移回,并更改函数头以返回指向
大小字符串数组的指针,详情如下:

    #define num_strings 20
    #define size_strings 20

    char (*read_file())[size_strings] {
或者,使用typedef:

    #define num_strings 20
    #define size_strings 20

    typedef char (*PCharArr)[size_strings];

    PCharArr read_file() {
…并相应地更改main中
p
的类型:

    char (*p)[size_strings];

这将返回(指向第一个元素的指针)一个字符数组数组,它或多或少相当于一个2D数组
char

,这一定是我见过的最奇怪的C代码了看起来像是某种表情符号你不能在C中返回数组,句号。由于它是声明为静态的,所以最好返回一个指向它的合适指针。更好的方法是在
main()
中声明它,并将其传递到函数中,而完全忘记返回它。如果返回失败,请检查来自
fopen()
的返回,不要从
malloc()
强制转换返回。还要学会正确格式化代码。我有代码在里面,以防fopen()失败。我把它拿出来只是为了发布我在这里关心的东西,也就是访问这个2d数组。
char*s=(char*)malloc(100):内存泄漏。更改为
chars[100]是,稍后我将开始编辑格式。现在,我只想让它起作用。它正在读取的txt文件很小,我分配的空间也足够了。我试图返回一个指向函数的指针。我在main()中编写了所有代码,并且它工作正常。但我在这里的目标是能够从函数调用它。我会看一看,但代码现在仍然在工作。谢谢你的时间和努力,非常感谢。如果我能在这里投票一千次,我会感谢你!!如果这是你想要的并且你倾向于接受答案的话,我会接受一次投票和一次接受。
    char (*p)[size_strings];