我正在写一个程序来记录棒球队,球员和平均数。它应该读入球队的名字,有多少支球队,他们有多少球员,然后取球员的名字+他的球队+他的平均数。之后,它应该打印最初输入的球队,当只有球队被提示时,每个球员从它和他们的平均值。然而,它做的最后一部分是错误的。我的代码是:

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

struct Player {
    char name[50];
    char teamName[50];
    float battingAv;
};

int main(void)
{
    int userNumber;
    printf("Enter the number of teams you wish to record: ");
    scanf("%d", &userNumber);
    int i;
    char teams[userNumber][40];
    for (i = 0; i < userNumber; i++) {
        char name[40];
        printf("Enter the name(s) of the teams: ");
        scanf("%s", &name);
        strcpy(teams[i], name);
    }

    int q;
    for (q = 0; q < userNumber; q++) {
        printf("Team %d is %s\n", q + 1, teams[q]);
    }

    int numOfPlayers;
    printf("Enter the TOTAL number of players for all teams: ");
    scanf("%d", &numOfPlayers);
    int j;
    struct Player playersEntered[numOfPlayers];
    for (j = 0; j < numOfPlayers; j++) {

        printf("Enter the %d Player name, Team name, and batting average: ", j + 1);
        scanf("%s %s %f", &playersEntered[j].name, &playersEntered[j].teamName, &playersEntered[j].battingAv);
    }

    printf("Listing of players and batting average according to team names:: \n");
    int m;
    for (m = 0; m < userNumber; m++) {
        int n;
        printf("%s-\n", teams[m]);
        for (n = 0; n < numOfPlayers; n++) {
            //if(playersEntered[n].teamName == teams[m])
            int result = strcmp(playersEntered[n].teamName, teams[m]);
            if (result == 0)
            {
                printf("\t%s %f\n ", playersEntered[m].name, playersEntered[m].battingAv);
            }
            else {
                continue;
            }
        }
    }

}

我的逻辑是,最后一个循环应该遍历playersEntered,并将为该特定球员指定的球队名称与开始时输入的球队列表进行比较,这样它只会在他们列出的球队下打印他们的名字。但我的输出是错误的。
我的输出应该是这样:c - 我的程序应该在队名下列出球员的得分,但会打印错误的得分。我怎样才能解决这个问题?-LMLPHP

最佳答案

printf("\t%s %f\n ", playersEntered[m].name, playersEntered[m].battingAv);

-->
printf("\t%s %f\n ", playersEntered[n].name, playersEntered[n].battingAv);

最好不要对嵌套循环变量使用mn(或ilj)来防止此类错误。
顺便说一句:
strcpy(teams[i], &name);

您不需要name的操作员地址。数组的名称是其第一个元素的自动地址。
多次出现的图案:
int m;
for(m = 0; m < userNumber; m++) {

请在for-语句中定义变量:
for(int m = 0; m < userNumber; ++m) { // ...

您正在使用int索引内存中的对象。正确的类型是size_t<stddef.h>),它保证足够大,可以容纳所有可能的对象大小和索引。它的scanf()-格式是"%zu"
谈论scanf()
从未!真的从来没有!使用"%s"而不指定宽度(=最大字符读取),这比给定给scanf()的参数中的空间少一个:
char name[40];
scanf("%39s", name);

09-17 20:09