Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数中的scanf似乎将垃圾值写入一个数组,而不是另一个数组,尽管两者相同_C_Arrays - Fatal编程技术网

函数中的scanf似乎将垃圾值写入一个数组,而不是另一个数组,尽管两者相同

函数中的scanf似乎将垃圾值写入一个数组,而不是另一个数组,尽管两者相同,c,arrays,C,Arrays,所以在函数getRoster中,我有两个数组,它们在main中以相同的方式定义,并以相同的方式调用。但出于某种原因,其中一个scanf函数将垃圾数据写入数组,因此在第91行(本例中为调试行)中,一个值是我输入的值,另一个值似乎是随机的。我已经自上而下地检查了这段代码,看看是否有我添加到一个数组而不是另一个数组的任何符号,我似乎找不到一个 #include <stdio.h> #include <stdlib.h> void getRoster(int *jerseyNu

所以在函数getRoster中,我有两个数组,它们在main中以相同的方式定义,并以相同的方式调用。但出于某种原因,其中一个scanf函数将垃圾数据写入数组,因此在第91行(本例中为调试行)中,一个值是我输入的值,另一个值似乎是随机的。我已经自上而下地检查了这段代码,看看是否有我添加到一个数组而不是另一个数组的任何符号,我似乎找不到一个

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

void getRoster(int *jerseyNumbers[10], int *playerRatings[10])
{
    int i;
    for (i=0; i<5; ++i)
    {
        printf("Enter player %d's jersey number\n", i+1);
        scanf("%d", &jerseyNumbers[i]);
        printf("Enter player %d's rating\n", i+1);
        scanf("%d", &playerRatings[i]);
    }
}

void updateRating(int *jerseyNumbers[10], int *playerRatings[10])
{
int i, n = -1, hold;
printf("Enter a jersey number:\n");
scanf("%d", n);
for (i=0; i<5; ++i)
    if(jerseyNumbers[i]==n)
        hold = n;
if (n=-1);
printf("Error");

printf("Enter a new rating for player:\n");
scanf("%d", &playerRatings[n]);
}

void aboveRating()
{

}

void replacePlayer()
{

}

void  outputRoster(int *jerseyNumbers[10], int *playerRatings[10])
{
    int i;
    for (i=0; i<5; ++i)
    {
        printf("Player %d  -- Jersey number: %d , Rating: %d \n", i+1, jerseyNumbers[i], playerRatings[i]);

    }

 }

void menu(int *jerseyNumbers[10], int *playerRatings[10])
{
    char menuInput;
    printf("\nMENU\n");
    printf("u - Update player rating\n");
    printf("a - Output players above a rating\n");
    printf("r - Replace player\n");
    printf("o - Output roster\n");
    printf("q - Quit\n");
    printf("\nChoose an option:\n");


    scanf(" %c", &menuInput);
    if (menuInput == 'u')
        {updateRating(&jerseyNumbers[10], &playerRatings[10]);
        }
    else if (menuInput == 'a')
        {aboveRating();
        }
    else if (menuInput == 'r')
         {replacePlayer();
        }
    else if (menuInput == 'o')
        {outputRoster(&jerseyNumbers[10], &playerRatings[10]);
        }
    else if (menuInput == 'q')
        printf("Reached Quit");
    else
        printf("Input Error\n");

}

int main()
{
    int *jerseyNumbers[10];
    int *playerRatings[10];
    char menuInput;
    int quitFlag = 0;
    getRoster(&jerseyNumbers[10], &playerRatings[10]);
    printf("%d %d", jerseyNumbers[0], playerRatings[1]);
    menu(&jerseyNumbers[10], &playerRatings[10]);

    return 0;
}
#包括
#包括
无效的球员名单(整数*球衣号码[10],整数*球员勘误表[10])
{
int i;
对于(i=0;i强烈建议:

养成经常使用花括号的习惯——即使你不需要它们

void updateRating(int *jerseyNumbers, int *playerRatings)  
  // You probably only need a pointer or an array - but probably not both ;)
{
  int i, n = -1, hold;
  printf("Enter a jersey number:\n");
  scanf("%d", n);
  for (i=0; i<5; ++i) {  // Curly brace here...
    if(jerseyNumbers[i]==n)  { // And here...
        hold = n;
    }
  }
  if (n=-1) {  // BUG ALERT: deleted ";" (and added a brace)
    printf("Error");  // BUG ALERT: fixed this by removing ";"?
  } else {
    printf("Enter a new rating for player:\n");
    scanf("%d", &playerRatings[n]);
}
而且,正如Rishikesh Raje正确指出的那样:


数组的定义和OP的函数调用也在这里 不正确。请同时提及这一点

强烈建议:

养成经常使用花括号的习惯——即使你不需要它们

void updateRating(int *jerseyNumbers, int *playerRatings)  
  // You probably only need a pointer or an array - but probably not both ;)
{
  int i, n = -1, hold;
  printf("Enter a jersey number:\n");
  scanf("%d", n);
  for (i=0; i<5; ++i) {  // Curly brace here...
    if(jerseyNumbers[i]==n)  { // And here...
        hold = n;
    }
  }
  if (n=-1) {  // BUG ALERT: deleted ";" (and added a brace)
    printf("Error");  // BUG ALERT: fixed this by removing ";"?
  } else {
    printf("Enter a new rating for player:\n");
    scanf("%d", &playerRatings[n]);
}
而且,正如Rishikesh Raje正确指出的那样:


数组的定义和OP的函数调用也在这里 不正确。请同时提及这一点


请参考@NaveenKumar和@DeiDei对您的问题的评论。 实际上,您的程序逻辑是正确的。但是您出了问题的地方是关于如何声明数组并将它们作为参数传递给函数的语法。我在下面列出了要进行的更改:

  • 首先,Dylan,不要将数组声明为:
    int
    *jerseyNumbers[10]
    int*playerRatings[10]
    。对于实际需要的常规数组,只需声明为:

    a、
    *运动衫编号
    *播放勘误表
    …删除尺寸。或

    b、
    jerseyNumbers[10]
    playerRatings[10]
    …从声明中删除
    *

  • 当您将这些数组作为参数传递给函数时,千万不要以这种方式发送。只需将数组名称作为参数传递即可。如下所示:
    getRoster(jerseyNumbers,playerRatings);
    菜单(jerseyNumbers,playerRatings);
  • 在函数定义中,表示数组的参数应该是
    *arrayname
    arrayname[size]
    。因为我们在声明过程中使用了第一个参数,所以在这里使用相同的参数,如下所示:

    void getrolister(int*jerseyNumbers,int*playerRatings){…}
    ,

    void更新(int*jerseyNumbers,int*playerRatings){…}
    ,

    void outputRoster(int*jerseyNumbers,int*playerRatings){…}
    ,

    void菜单(int*jerseyNumbers,int*playerRatings){…}

  • 正如@PaulSm4所建议的,不要在
    if
    条件句结尾使用分号。虽然这不是问题的原因,但这是一种需要遵循的做法,需要避免错误

  • 我已经附上了下面的工作代码,以及输出

    代码

    #include <stdio.h>
    #include <stdlib.h>
    
    void getRoster(int *jerseyNumbers, int *playerRatings)
    {
        int i;
        for (i=0; i<5; ++i)
        {
            printf("Enter player %d's jersey number\n", i+1);
            scanf("%d", &jerseyNumbers[i]);
            printf("Enter player %d's rating\n", i+1);
            scanf("%d", &playerRatings[i]);
        }
    }
    
    void updateRating(int *jerseyNumbers, int *playerRatings)
    {
    int i, n = -1, hold;
    printf("Enter a jersey number:\n");
    scanf("%d", n);
    for (i=0; i<5; ++i)
        if(jerseyNumbers[i]==n)
            hold = n;
    if (n=-1)
        printf("Error");
    
    printf("Enter a new rating for player:\n");
    scanf("%d", &playerRatings[n]);
    }
    
    void aboveRating()
    {
    
    }
    
    void replacePlayer()
    {
    
    }
    
    void  outputRoster(int *jerseyNumbers, int *playerRatings)
    {
        int i;
        for (i=0; i<5; ++i)
        {
            printf("Player %d  -- Jersey number: %d , Rating: %d \n", i+1, jerseyNumbers[i], playerRatings[i]);
    
        }
    
     }
    
    void menu(int *jerseyNumbers, int *playerRatings)
    {
        char menuInput;
        printf("\nMENU\n");
        printf("u - Update player rating\n");
        printf("a - Output players above a rating\n");
        printf("r - Replace player\n");
        printf("o - Output roster\n");
        printf("q - Quit\n");
        printf("\nChoose an option:\n");
    
    
        scanf(" %c", &menuInput);
        if (menuInput == 'u')
            {updateRating(jerseyNumbers, playerRatings);
            }
        else if (menuInput == 'a')
            {aboveRating();
            }
        else if (menuInput == 'r')
             {replacePlayer();
            }
        else if (menuInput == 'o')
            {outputRoster(jerseyNumbers, playerRatings);
            }
        else if (menuInput == 'q')
            printf("Reached Quit");
        else
            printf("Input Error\n");
    
    }
    
    int main()
    {
        int jerseyNumbers[10];
        int playerRatings[10];
        char menuInput;
        int quitFlag = 0;
        getRoster(jerseyNumbers, playerRatings);
        printf("%d %d", jerseyNumbers[0], playerRatings[1]);
        menu(jerseyNumbers, playerRatings);
        return 0;
    }
    

    希望这能有所帮助。

    请参考@NaveenKumar和@DeiDei对您的问题的评论。 实际上,您的程序逻辑是正确的。但是您出了问题的地方是关于如何声明数组并将它们作为参数传递给函数的语法。我在下面列出了要进行的更改:

  • 首先,Dylan,不要将数组声明为:
    int
    *jerseyNumbers[10]
    int*playerRatings[10]
    。对于实际需要的常规数组,只需声明为:

    a、
    *运动衫编号
    *播放勘误表
    …删除尺寸。或

    b、
    jerseyNumbers[10]
    playerRatings[10]
    …从声明中删除
    *

  • 当您将这些数组作为参数传递给函数时,千万不要以这种方式发送。只需将数组名称作为参数传递即可。如下所示:
    getRoster(jerseyNumbers,playerRatings);
    菜单(jerseyNumbers,playerRatings);
  • 在函数定义中,表示数组的参数应该是
    *arrayname
    arrayname[size]
    。因为我们在声明过程中使用了第一个参数,所以在这里使用相同的参数,如下所示:

    void getrolister(int*jerseyNumbers,int*playerRatings){…}
    ,

    void更新(int*jerseyNumbers,int*playerRatings){…}
    ,

    void outputRoster(int*jerseyNumbers,int*playerRatings){…}
    ,

    void菜单(int*jerseyNumbers,int*playerRatings){…}

  • 正如@PaulSm4所建议的,不要在
    if
    条件句结尾使用分号。虽然这不是问题的原因,但这是一种需要遵循的做法,需要避免错误

  • 我已经附上了下面的工作代码,以及输出

    代码

    #include <stdio.h>
    #include <stdlib.h>
    
    void getRoster(int *jerseyNumbers, int *playerRatings)
    {
        int i;
        for (i=0; i<5; ++i)
        {
            printf("Enter player %d's jersey number\n", i+1);
            scanf("%d", &jerseyNumbers[i]);
            printf("Enter player %d's rating\n", i+1);
            scanf("%d", &playerRatings[i]);
        }
    }
    
    void updateRating(int *jerseyNumbers, int *playerRatings)
    {
    int i, n = -1, hold;
    printf("Enter a jersey number:\n");
    scanf("%d", n);
    for (i=0; i<5; ++i)
        if(jerseyNumbers[i]==n)
            hold = n;
    if (n=-1)
        printf("Error");
    
    printf("Enter a new rating for player:\n");
    scanf("%d", &playerRatings[n]);
    }
    
    void aboveRating()
    {
    
    }
    
    void replacePlayer()
    {
    
    }
    
    void  outputRoster(int *jerseyNumbers, int *playerRatings)
    {
        int i;
        for (i=0; i<5; ++i)
        {
            printf("Player %d  -- Jersey number: %d , Rating: %d \n", i+1, jerseyNumbers[i], playerRatings[i]);
    
        }
    
     }
    
    void menu(int *jerseyNumbers, int *playerRatings)
    {
        char menuInput;
        printf("\nMENU\n");
        printf("u - Update player rating\n");
        printf("a - Output players above a rating\n");
        printf("r - Replace player\n");
        printf("o - Output roster\n");
        printf("q - Quit\n");
        printf("\nChoose an option:\n");
    
    
        scanf(" %c", &menuInput);
        if (menuInput == 'u')
            {updateRating(jerseyNumbers, playerRatings);
            }
        else if (menuInput == 'a')
            {aboveRating();
            }
        else if (menuInput == 'r')
             {replacePlayer();
            }
        else if (menuInput == 'o')
            {outputRoster(jerseyNumbers, playerRatings);
            }
        else if (menuInput == 'q')
            printf("Reached Quit");
        else
            printf("Input Error\n");
    
    }
    
    int main()
    {
        int jerseyNumbers[10];
        int playerRatings[10];
        char menuInput;
        int quitFlag = 0;
        getRoster(jerseyNumbers, playerRatings);
        printf("%d %d", jerseyNumbers[0], playerRatings[1]);
        menu(jerseyNumbers, playerRatings);
        return 0;
    }
    

    希望这有帮助。

    您应该在启用所有警告的情况下编译。
    int*jerseyNumbers[10]
    实际上是
    int**jerseyNumbers
    。现在想想
    &jerseyNumbers[i]
    的意思。为什么您需要“int*jerseyNumbers[10]”来只保存10个整数?它应该是“int-jerseyNumbers[10];”我想。当你在
    main()中使用
    get花名册(&jerseyNumbers[10],&playerRatings[10]);
    ,您传递的地址超出了数组的末尾,这不是您想要的,并且在使用指针时会导致未定义的行为。您有
    int
    指针数组;您从不为指针分配
    int
    值。这是另一个问题。您传递相同的地址到
    menu()
    -更多麻烦。然后,在
    menu()
    中,您调用,例如,
    更新(&jerseyNumbers[10],&playerRatings[10])<