无法将满足条件的二维数组中的字符串从单独的函数传递到主函数

时间:2019-03-29 17:05:33

标签: c

  

在此任务中,您将获得最关键的审阅者列表。一种   关键审阅者定义为:

     

具有相同否定建议('n')的评论者   作为评论最多的评论者。

     

使用这个定义来定义关键审阅者,   查看审阅者的建议列表,并确定它们是否   是不是重要的评论者。

     

**该函数的返回值应为关键审阅者人数。 **

     

此外,由...创建的重要评论者姓名列表   该功能也必须在该功能之外可以访问。

     

在此示例中,针对   一位审阅者是2。确定最高数量的   ‘n’条推荐,您可以查看哪些评论者   “重要评论者”。在此示例中,我们可以确定审阅者   “ Larry”,“ Judi”,“ Manisha”,“ Dora”和“ Nick”是评论者   因为它们是由数组索引1、3、6、8表示的审阅者   和9。数字5将由函数的   返回值,因为这是在   清单。此功能没有打印语句。

努力将只有重要评论者的姓名传递给要显示在main中的数组。

//Function prototypes
void Recommendations(); //task 1
int criticalReviewers(); //task 2

//MAIN FUNCTION
int main(void) {

  //Variables
  char reviewerNames[NUMBER_REVIEWERS][30] = { "Ritu",
                                             "Larry",
                                             "Dan",
                                             "Judi",
                                             "Eric",
                                             "Isabelle",
                                             "Manisha",
                                             "Terra",
                                             "Dora",
                                             "Nick" };
  char movieNames[NUMBER_MOVIES][50] = { "Star Wars",
                                       "Incredibles",
                                       "Gone with the wind" };
  char userReviews[NUMBER_REVIEWERS][NUMBER_MOVIES];
  char reviewerAnswers[10][3];
  char negativeReviewers[10][30];


  //TASK TWO
  printf("\n**********************************************\n");
  printf("Task 2: Get names of critical reviewers\n\n");

  //call to task 2 function
  printf("Number of Critical Reviewers: %d\n", criticalReviewers(reviewerAnswers, reviewerNames, negativeReviewers));
  printf("Critical Reviewers: ");

  for (int k=0; k<criticalReviewers(reviewerAnswers, reviewerNames, negativeReviewers); k++) {

    printf("%s, ", negativeReviewers + k);

  }

  printf("%s", negativeReviewers + criticalReviewers(reviewerAnswers, reviewerNames, negativeReviewers));

  //CALL TO TASK 3 FUNCTION
  mostRecommended(reviewerAnswers, movieNames);

WINPAUSE; // REMOVE BEFORE SUBMITTING
return 0;
}

//执行一项功能

//TASK 2 FUNCTION
int criticalReviewers(char userAnswers[10][3], char Reviewers[][30], char critReviewers[][30]) {

  int i=0;
  int j=0;
  int numCriticalReviewers = 0;
  int criticalScore = 0;
  int criticalReviewers[10];
  int timesSkipped=0;

  //loop to determine number of critical REVIEWERS
  for (i=0; i<10; i++) {

    criticalReviewers[i] = 0;

    for (j=0; j<3; j++) {

      if (userAnswers[i][j] == 'n') {

        criticalReviewers[i] = criticalReviewers[i] + 1;

      }

    if (criticalReviewers[i] > criticalScore) {

      criticalScore = criticalReviewers[i];

  }
 }
}

    for (i=0; i<10; i++) {

        if (criticalReviewers[i] == criticalScore) {

          numCriticalReviewers = numCriticalReviewers + 1;

          for (int k=i; k<i+1; k++) {

            critReviewers[k-timesSkipped][30] = Reviewers[k][30];
            timesSkipped = 0;

          }

        }
        else {

          timesSkipped = timesSkipped + 1;

        }
  }

    for (i=0; i<10; i++) {

        if (criticalReviewers[i] == criticalScore) {

          critReviewers = Reviewers + i;

        }


    }

  return numCriticalReviewers;

 }

我已经正确地在主栏中打印了关键审稿人的数量,但在下面应打印我不知道的关键审稿人的姓名。每次我尝试传递值时,它都会打印随机的字母和符号字符串。

1 个答案:

答案 0 :(得分:0)

问题是,您需要在功能critReviewers中将检查者分配到criticalReviewers数组。请注意如何将第二个索引设置为30。这样做是在数组中仅分配第30个索引(这超出了数组的范围,索引为0-29,但这是另一个问题)。

您应该做的是要么遍历字符串以逐个复制每个索引,要么使用string.h库中的strcpy之类的函数复制字符串。否则,看起来一切正常。

解决方案1:

for(i = 0; i < 30; i++) {
    array1[someIndex][i] = array2[someIndex][i];
}

这将一个一个地复制array2[someIndex]中的每个条目。

解决方案2:

strcpy(array1[someIndex], array2[someIndex]);

这会将array2[someIndex]中的整个字符串复制到array1[someIndex]

如果您在阅读完2d数组后仍然感到困惑,我还将花一些时间来阅读它。我总是喜欢geeksforgeeks.com这样的东西:https://www.geeksforgeeks.org/multidimensional-arrays-c-cpp/