2016-03-23 31 views
0

我意识到这个问题经常被问到,但我还是不太明白它是如何工作的。我想尝试将我的文件读入我的结构中,在函数内部并通过指向函数的指针传递结构。我不确定如何写函数原型。使用指针传递结构体和返回数组的结构体和返回数组 - 功能

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

#define MAX 90 
#define STR 200 
#define MAXLEN 40 

struct human { 
    char name[MAXLEN]; 
    char surname[MAXLEN]; 
    int age; 
    float weight; 
}; 
int main(int argc, char *argv[]) { 
    char *dlim= " ", *end = "\n"; 
    char *string; 
    string = (char *)malloc(sizeof(char) * STR); 
    int i = 0, j = 0; 
    struct human *man = malloc(sizeof(struct human) * MAX); 

    FILE *fin = fopen("data.txt", "r"); 
    if (fin == NULL) { 
     printf("Cannot open file\n"); 
     exit(0); 
    } 
    while (fgets (string, STR, fin)){ 
     read (string, &man[i], dlim, end); 
     i++; 
    } 
    fclose(fin); 

    free(string); 
    free(man); 

    return 0; 
} 

struct human *man read(char *fstring, struct *man, char *div, char *end){ 
    int i=0; 
    char *tok; 

     tok = strtok(string, dlim); 
     strcpy(man[i].name, tok); 

     tok = strtok(NULL, dlim); 
     strcpy(man[i].surname,tok); 

     tok = strtok(NULL, dlim); 
     man[i].age = atoi(tok); 

     tok = strtok(NULL, end); 
     man[i].weight = atof(tok); 

    return man[i]; 

} 

这个功能是什么意思?我是否正确地假设通过使用指针,该结构将自动更新在主,无需返回的东西在函数中?

函数也可以不返回任何东西(void),因为指针的使用会自动传递给main?

谢谢!

+0

函数read必须返回一些东西。你不需要返回一个结构体的人类指针。你已经传入了一个指向要填充的结构的指针。如果失败,你最好返回0,如果成功或者返回一个非零的错误代码。这是一个典型的行为。 – bruceg

回答

2

您的代码很接近,但填充人体结构的子例程中的指针逻辑不正确。看下面的返工和轻微的简化,是否有助于你理解如何传递结构:

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

#define MAXIMUM_HUMANS 90 
#define MAXIMUM_INPUT_STRING_LENGTH 200 
#define MAXIMUM_STRING_LENGTH 40 

struct human { 
    char name[MAXIMUM_STRING_LENGTH]; 
    char surname[MAXIMUM_STRING_LENGTH]; 
    int age; 
    float weight; 
}; 

void initialize_human(char *string, struct human *man, char *delimiter, char *end) { 
    char *token; 

    token = strtok(string, delimiter); 
    strcpy(man->name, token); 

    token = strtok(NULL, delimiter); 
    strcpy(man->surname, token); 

    token = strtok(NULL, delimiter); 
    man->age = atoi(token); 

    token = strtok(NULL, end); 
    man->weight = atof(token); 
} 

int main(int argc, char *argv[]) { 
    char *dlim= " ", *end = "\n"; 
    char string[MAXIMUM_INPUT_STRING_LENGTH]; 
    struct human humans[MAXIMUM_HUMANS]; 

    FILE *fin = fopen("data.txt", "r"); 

    if (fin == NULL) { 
     fprintf(stderr, "Cannot open file\n"); 
     exit(1); 
    } 

    int population; // after loop, this contains total body count 

    for (population = 0; fgets(string, MAXIMUM_INPUT_STRING_LENGTH, fin); population ++) { 
     initialize_human(string, &humans[population], dlim, end); 
    } 

    printf("population: %d\n", population); 
    printf("last added: %s who weighs %f\n", humans[population - 1].surname, humans[population - 1].weight); // test if we loaded it up correctly 

    fclose(fin); 

    return 0; 
}