将整个结构传递给函数并显示内容C

时间:2017-08-02 00:34:49

标签: c structure

我已经坚持了一段时间。该程序将文本文件中的行读入结构数组。这里有几行,以便您了解存储在结构数组中的内容。

A|Baltimore Orioles|Oriole Park|333 West Camden Street|Baltimore|MD|21201|(410) 685-9800|orioles.com
N|Washington Nationals|Nationals Park|1500 South Capitol Street, SE|Washington|DC|20003-1507|(202) 675-6287|nationals.com

在使用正确的数据加载数组时没有问题。我使用这段代码测试了内容,它显示了正确的数据。

        scanf("%i",&userChoice);

        if(userChoice == 1){
        for(index=0; index<count; index++)
        {
            if(strcmp("A", teams[index].leagueName)== 0)
                {

                    americanLeague(&teams[index]);


                }
        }
        }

该程序有一个主菜单,选项1是显示来自美国联盟的所有团队或来自文本文件的“A”。现在我不希望for loop / if语句在main函数中运行。我希望它只是为userchoice运行if语句并调用americanLeague函数。这是我的尝试

scanf("%i",&userChoice);

if(userChoice == 1){

                    americanLeague(&teams[0]);


        }

这只是调用了美国联盟的功能

void americanLeague(team_t *aTeamPtr)
{
        int index;

        for(index=0; index<=MAX_TEAMS; index++){
        if(strcmp("A", aTeamPtr[index].leagueName)== 0)
            {

                printf("LEAGUE:%s TEAM:%s PARKNAME:%s ADDRESS:%s CITY:%s STATE:%s ZIPCODE:%s PHONE#:%s WEBADDRESS:%s\n\n",
                                                 aTeamPtr[index].leagueName, aTeamPtr[index].teamName,
                                                 aTeamPtr[index].parkName, aTeamPtr[index].teamAddress,
                                                 aTeamPtr[index].teamCity, aTeamPtr[index].teamState,
                                                 aTeamPtr[index].zipCode, aTeamPtr[index].phoneNumber,
                                                 aTeamPtr[index].webAddress);


            }
        }
}

这是我尝试显示团队信息将结构数组传递到另一个函数的尝试。代码不起作用,但它不会给我任何错误它只输出空格。我还将添加结构和如何为了以防万一,我读了文件。

typedef struct
{
    char leagueName[LEAGUE_NAME + 1];
    char teamName[LEN_NAME + 1];
    char parkName[PARK_NAME + 1];
    char teamAddress[TEAM_ADDRESS + 1];
    char teamCity[TEAM_CITY + 1];
    char teamState[TEAM_STATE + 1];
    char zipCode[ZIP_CODE + 1];
    char phoneNumber[PHONE_NUMBER + 1];
    char webAddress[WEB_ADDRESS + 1];


} team_t;

int main(void)
{
    FILE * filePtr;
    int index, count;
    char line[LEN_LINE + 1];
    char repeat;
    team_t teams[MAX_LINES];
    filePtr = fopen("MLBteams.txt", "r");
    if(filePtr == NULL)
    {
        printf("Unable to open file.\n");
    }
    else
    {
        index = 0;
        while(index<MAX_LINES && fgets(line, LEN_LINE, filePtr))
        {
            if(9 == sscanf(line,"%5[^|]| %40[^|]| %35[^|]| %40[^|]| %30[^|]| %5[^|]| %10[^|]| %30[^|]| %25[^\n]", teams[index].leagueName, teams[index].teamName,
                                                                                                                   teams[index].parkName, teams[index].teamAddress,
                                                                                                                   teams[index].teamCity, teams[index].teamState,
                                                                                                                   teams[index].zipCode, teams[index].phoneNumber,
                                                                                                                   teams[index].webAddress)

               )
            {
                index++;
            }
        }
        fclose(filePtr);
        count = index;

将正确的数据读入结构数组时没有问题。我已经在main函数中多次测试了输出。无论如何,任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

您显然将数组(或指针)传递给一个函数,该函数也将其视为指向单个实例的指针。您可以在aTeamPtr[index].leagueName以及aTeamPtr->leagueName处看到代码中的差异。

你想要哪一个?

考虑这段代码及其输出:

int size = 10;

struct iint {
    int i;
};

void foo(struct iint* i) {
    for (int j = 0; j < size; ++j) {
        printf("%d", i[j].i);
    }
    printf("\n%d\n", i->i);
}

int main() {
    struct iint i[size];
    for (int j = 0; j < size; ++j) {
        i[j].i = j;
    }
    foo(i);
    return 0;
}

// Output:
// 0123456789
// 0

那是因为指向数组的指针指向第一个元素。如果您选择互换使用,C并不在意。