2013-03-13 99 views
0

我是编程新手。我有:返回字符数组?? ??(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; 
} 

随着我只能返回单个字符,但我需要返回完整字符数组(地图[ROWS]);我该怎么做?

+0

为了可惜,请学习以正统(意思是“可读”)方式缩进代码。您的代码很难阅读,因为它忽略了缩进规则。为了在SO上进行演示,最好不要使用标签,并且每个级别缩进4个空格。 – 2013-03-13 03:02:20

回答

1

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

scanf("%s", &file); 

我想你需要做的是这样一句:

scanf("%s", file); 

因为数组名文件是一个指针本身,你不需要使用&

其次,你可以通过return map[0]获得一个字符数组,因为它是一个char *类型,即C中的string。考虑一下。

+0

你对''''文件''的观察是正确的 - 我从格式化的代码中删除了它,但留下了一个评论,说它在那里。 – 2013-03-13 03:11:21

0

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

在C中,大多数变量都是按值传递的。如果一个变量的值在一个函数中被修改,那么新值将不能在程序中的其他地方访问。然而,数组是通过引用传递的,所以funck可以访问数组的内存。在这里看到更多的信息:

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

0

没有彻底阅读你的代码,
但你的主要问题是很清楚的,
你需要学习更多有关:按地址,数组,指针传递。

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

你要么通过地址(数组本身),要么传递一个mableced指针(记住为空)。你需要做的,除了在代码中固定其他错误

#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; 
} 
0

两件事情:

你期望得到一个字符串数组,这将是字符**类型。

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

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; 
}