2013-03-13 3 views
0

Je suis nouveau à la programmation. J'ai:Retour tableau tableau ?? (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; 
} 

Avec que je peux retourner seulement seul omble chevalier mais je dois retourner tableau de caractères complète (carte [RANGS]); Comment puis-je le faire?

+0

Par pitié, s'il vous plaît, apprenez à mettre votre code en retrait de façon orthodoxe (c'est-à-dire «lisible»). Votre code est très difficile à lire car il ne tient pas compte des règles d'indentation. Pour une présentation sur SO, il est préférable de ne pas utiliser d'onglets et d'indenter le code de 4 espaces par niveau. –

Répondre

1

Je pense qu'il y a quelques problèmes dans votre code. Premièrement, comment pouvez-vous utiliser ce morceau de code?

scanf("%s", &file); 

Je pense que ce que vous devez faire est celle-ci:

scanf("%s", file); 

Parce que le fichier nom du tableau est un pointeur lui-même, vous n'avez pas besoin d'utiliser &. Deuxièmement, vous pouvez obtenir un tableau de caractères par return map[0], parce que c'est un type char *, à savoir string en C. Pensez-y.

+0

Votre observation à propos du '&' avant 'file' était correcte - je l'ai enlevé du code formaté mais j'ai laissé un commentaire qu'il était là. –

0

Si vous passez un tableau à une fonction, toutes les modifications apportées à ce tableau dans la fonction seront accessibles par votre fonction principale. Cela signifie que vous n'avez pas besoin de retourner le tableau, il suffit de modifier votre tableau dans funkc et le principal va voir le nouveau tableau.

En C, la plupart des variables sont transmises par valeur. Si la valeur d'une variable est modifiée dans une fonction, la nouvelle valeur ne sera pas accessible ailleurs dans le programme. Cependant, les tableaux sont passés par référence, ainsi funck a accès à la mémoire du tableau. Voir ici pour plus d'informations:

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

0

lecture pas votre code à fond,
Mais votre principal problème est tout à fait clair,
vous devez étudier plus sur: passer par adresse, tableau, pointeur. Ci-dessous sont mon code très simple pour passer tableau pour la fonction et retourner à la principale.

Vous pouvez soit passer par l'adresse (tableau lui-même est), ou passer un pointeur malloced (rappeler à libérer).

#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

Deux choses que vous devez faire, en plus de fixer d'autres erreurs dans le code:

Vous attendez d'obtenir un tableau de chaînes, ce qui serait char ** de type.

Vous devez également allouer de la mémoire pour un tableau, car le renvoi d'une référence de variable automatique n'est pas une bonne idée. Vous devez également allouer de la mémoire pour chaque entrée du tableau, car le mélange de références de chaînes statiques et de mémoire allouée n'est pas non plus une bonne idée.

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