返回char数组??(C)

时间:2013-03-13 02:52:50

标签: c

我是编程新手。我有:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // With luck, this declares strdup()

enum { ROWS = 50 };

static char *funkc(FILE *fp,char file[50])
{
    int q,row;
    char charbuffer[2],ch,*map[ROWS];

    ch=getc(fp);
    q=1;
    while (ch!=EOF){
        ch=getc(fp);
        q++;
    } 

    for (row = 0; row <=q; row++){
        map[row] = "  ";
    }
    fp = fopen(file, "r");


    for (row = 0; row <= q; row++) {
        if (fgets(charbuffer, 2, fp))
            map[row] = strdup(charbuffer);
    }

    for (row = 0; row <= q; row++) {
        printf("%s", map[row]);
    }
    return map[3];
}

int main(void)
{
    char *map2[ROWS];
    FILE *fp;
    char file[50]; // Unused variable *map[ROWS];
    printf("file name \n");
    scanf("%s",file);  // Removed ampersand from file
    if ((fp=fopen(file,"r"))==NULL)
    {
        printf("Error \n");
        exit(1);
    }

    map2[0]=funkc(fp,file);
    printf("%s",map2[0]);   // Add missing semicolon
    return 0;
}

有了这个,我只能返回单个char,但我需要返回完整的char数组(map [ROWS]);我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

我认为您的代码存在一些问题。 首先,你如何使用这段代码?

    scanf("%s", &file);

我认为你需要做的就是这个:

    scanf("%s", file);

因为数组名称文件本身就是指针,所以您不需要使用&

其次,您可以按return map[0]获取一系列字符,因为它是char *类型,即C中的string。想一想。

答案 1 :(得分:0)

如果将数组传递给函数,则main函数可以访问函数中对该数组所做的任何更改。这意味着您不必返回数组,只需在funkc中修改数组,main将看到新数组。

在C中,大多数变量都是按值传递的。如果在函数中修改了变量的值,则新值将无法在程序的其他位置访问。但是,数组是通过引用传递的,因此funck可以访问数组的内存。有关更多信息,请参见此处:

http://staff.um.edu.mt/csta1/courses/lectures/csa2060/c6.html

答案 2 :(得分:0)

不彻底阅读您的代码,
但你的主要问题很明显,
你需要更多地了解:传递地址,数组,指针。

下面是我为函数传递数组并返回main的非常简单的代码。

你要么通过地址传递(数组本身就是),要么传递一个malloced指针(记住自由)。

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

int test(char *map)
{
    strcpy(map, "hello, world");

    return 0;
}

int main(int argc, char **argv)
{
  char map[20];
  //char *map = malloc(sizeof(char) * 20);

  test(map);

  printf("%s\n", map);

  //free(map);
  return 0;
}

答案 3 :(得分:0)

除了修复代码中的其他错误之外,还需要做两件事:

您希望获得一个字符串数组,这将是 char ** 类型。

您还需要为数组分配内存,因为返回自动变量引用不是一个好主意。你还需要为数组中的每个条目分配内存,因为混合静态字符串引用和分配的内存也不是一个好主意。

include ...

enum { ROWS = 50 };

static char **funkc(FILE *fp)
{
    long fileSize = 0;
    int row;
    char **map = NULL;

    map = (char**)calloc(ROWS, sizeof(char*));

    fseek(fp, SEEK_END, 0);
    fileSize = ftell(fp);
    fseek(fp, SEEK_SET, 0);

    for (row = 0; row < fileSize && row < ROWS; row++)
    {
        char buffer[2];
        buffer[0] = fgetc(fp);
        buffer[1] = 0;
        map[row] = strdup(buffer);
    }
    for (;row < ROWS; row++)
    {
        map[row] = strdup("   ");
    }

    return map;
}

int main(int argc, const char *argv[])
{
    char **map;
    FILE *fp;
    char fname[50];
    int row;

    printf("file name \n");
    scanf("%s", fname);
    fp = fopen(fname, "r");

    map = funkc(fp);

    fclose(fp);
    for (row = 0; row < ROWS; ++row)
    {
       printf("ROW[%d]: %s\n", row, map[row]);
    }
    for (row = 0; row < ROWS; ++row)
    {
       free(map[row]);
    }
    free(map);

    return 0;
}