循环时在多维数组的第二级上更改值

时间:2019-06-23 03:42:19

标签: c string multidimensional-array

我有一个硬件作业要完成。我已经完成了大部分工作,但是我陷入了一个困境。我在C语言中有一个二维的字符串循环,代表学生及其成绩。

我的目标是让用户显示成绩,然后进行更新。我构造了数组,以在两个空格字符之后显示学生的姓名和年级。我设法达到了可以在硬编码数组中找到学生的地步。我还可以隔离最后一个数组值(等级)并显示它。我的问题是当我尝试将该值更新为新值时。我现在用的方式替换成绩时的代码将覆盖整个值以及学生姓名。

编辑: 我想进行更新,我相信当前的输出只是用更新的成绩覆盖了学生的数组值,但实际上只是用更新的成绩值更新了数组中的第一个值。

我尝试使用strcat尝试将学生的姓名和更新的成绩连接起来。只是看看会发生什么。看起来像

strcat(updated_grade, student_info[j])

我尝试使用不同的指针以及我的代码进行尝试,但无济于事。

int DisplaystudentInformation()
{
  // Welcome Message shows after successful login
  printf("%s\n", "Welcome professor. Below are all student grades");

  // Hard code array to hold student information
  char student_info[5][10] =
  {
    "Jim  A",
    "Tom  C",
    "Ben  C",
    "Alice  D",
    "Ruby  F",
  };

  // Initialize i to use to loop through array
  int i = 0;
  int j = 0;
  int t = 0;
  for (i = 0; i < sizeof(student_info)/sizeof(student_info[0]); i++)
  {
    // Used multiple spaces to get rid of dangling new line
    printf("%s    \n", student_info[i]);
  }

  // Character for reading if faculty wants to adjust grades
  char adjust_grades[2];

  printf("%s", "Adjust grades for students? Please Type y to adjust, or n to exit: ");
  scanf("%s", adjust_grades);

  // Check if adjust grades is Y
  // Using == as the correct assign operator
  if (strcmp(adjust_grades, "y") == 0 || strcmp(adjust_grades, "Y") == 0)
  {
    //Set up vars for adjusting grades
    char student_to_adjust[10];
    char temp_name_input[3];

    // Get name of student
    printf("%s", "Please enter students name: \n");
    scanf("%s", student_to_adjust);

    // Create a temp name to copy the first three letters of a student's name
    strncpy(temp_name_input, student_to_adjust, 3);

    // Terminate null characters manually
    if (strlen(student_to_adjust) == 5 || strlen(student_to_adjust) == 4)
    {
      temp_name_input[strlen(temp_name_input) - 3] = '\0';
    }
    else
    {
      temp_name_input[strlen(temp_name_input) - 3] = '\0';
    }


    // Temp char to serve as copied string, still using the first three letters of the student name
    char temp_student_name[3];

    for (j = 0; j < sizeof(student_info)/sizeof(student_info[0]); j++)
    {

      strncpy(temp_student_name, student_info[j], 3);

      // Found Student and will edit grade
      if(strcmp(temp_student_name, temp_name_input) == 0)
      {
        // Use this to adjust grades
        printf("%s", "\nStudent found. \n");

        // Determine the size of the array and adjust the position of the array spot.
        if (strlen(student_info[j]) == 6)
        {
          printf("\nCurrent Grade: %c \n", student_info[j][5]);

          //New grade character
          char new_grade[1];

          printf("%s", "Enter new grade: \n");
          scanf("%s", new_grade);

          student_info[j][6] =  *new_grade;


          // Show all the students grades along with the updated grade
          for (t = 0; t < sizeof(student_info)/sizeof(student_info[0]); t++)
          {
            printf("%s    \n", student_info[t]);
          }
        }

        break;
      }
    }


  }
  else if (strcmp(adjust_grades, "n") == 0 || strcmp(adjust_grades, "N") == 0) // Option to log out if the user is not adjusting anything
  {
    printf("%s", "\nLogging you out \n");
    exit(0);
  }
  else // Logs out if invalid entry it put in
  {
    printf("%s", "\nInvalid input, logging out. \n");
    exit(0);
  }

}

我期望的是类似的东西

Jim  A
Tom  C
Ben  C
Alice  D
Ruby  F

但是我现在得到的是:

F
Jim  A
Tom  C
Ben  CF
Alice  D
Ruby  F

1 个答案:

答案 0 :(得分:3)

您有多个缓冲区超载,它们严重占用了内存。程序的行为,即使是正确的,也必须修正后才能预测。

第一个是char adjust_grades[1];,它的长度必须至少为2,才能包含1个字符和NULL终止符。

第二个是char temp_name_input[3];,同样,它没有空终止符。

下一个是strlen(temp_name_input),在temp_name_input是有效字符串之前被调用(两次),因此结果是伪造的。仔细检查strncpy的作用-如果源字符串包含3个以上的字符,则不会生成终止的字符串。

下一个是char temp_student_name[3];,它又不够长。

在程序的这一点上,您的记忆力确实良好,因此所有赌注都没有了。可能还会有更多问题,但是从这些问题入手,您将可以顺利完成一些工作。