-1

私はプログラミングが初めてです。私は持っている:

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

これにより、単一の文字のみを返すことができますが、完全な文字配列 (map[ROWS]) を返す必要があります。どうすればできますか?

4

4 に答える 4

1

あなたのコードにはいくつかの問題があると思います。まず、このコードをどのように使用できますか?

    scanf("%s", &file);

あなたがする必要があるのはこれだと思います:

    scanf("%s", file);

配列名ファイルはポインタそのものなので、使う必要はありません&

第 2 に、 によって char の配列を取得できます。return map[0]これはchar *型、つまりstringC の a であるためです。考えてみてください。

于 2013-03-13T03:09:21.100 に答える
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;
}
于 2013-03-13T03:22:13.730 に答える
0

コード内の他のエラーを修正する以外に、次の 2 つのことを行う必要があります。

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;
}
于 2013-03-13T09:24:45.310 に答える
0

配列を関数に渡す場合、関数内でその配列に加えられた変更は、メイン関数からアクセスできます。これは、配列を返す必要がないことを意味します。funkc で配列を変更するだけで、main は新しい配列を認識します。

C では、ほとんどの変数は値によって渡されます。変数の値が関数で変更された場合、新しい値はプログラムの他の場所からアクセスできなくなります。ただし、配列は参照によって渡されるため、 funck は配列のメモリにアクセスできます。詳細については、こちらを参照してください。

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

于 2013-03-13T03:09:59.287 に答える