我有一个硬件作业要完成。我已经完成了大部分工作,但是我陷入了一个困境。我在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
答案 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];
,它又不够长。
在程序的这一点上,您的记忆力确实良好,因此所有赌注都没有了。可能还会有更多问题,但是从这些问题入手,您将可以顺利完成一些工作。