仅用于循环打印最后一项(C)

仅用于循环打印最后一项(C),c,arrays,structure,C,Arrays,Structure,您好,我正在尝试编写一个C程序,它基本上接受一个结构,将其存储在一个数组中,然后以以下格式打印该结构: Lastname,Firstname\n 等级:B 对于添加到数组中的每一项,现在的问题是只打印最后添加的项。我知道这是在for循环中发生的,因为代码正在执行和打印。我不打算发布整个程序,因为它有很多代码,所以我将只放重要的内容 void add(char* student_firstname, char* student_lastname, char* student_grade, char

您好,我正在尝试编写一个C程序,它基本上接受一个结构,将其存储在一个数组中,然后以以下格式打印该结构:

Lastname,Firstname\n 等级:B

对于添加到数组中的每一项,现在的问题是只打印最后添加的项。我知道这是在for循环中发生的,因为代码正在执行和打印。我不打算发布整个程序,因为它有很多代码,所以我将只放重要的内容

void add(char* student_firstname, char* student_lastname, char* student_grade, char* student_level, struct student* list)
{

    int i;
    for (i = count-1; i < count; i++){
        if ((strcmp(list[i].lastName, student_lastname) != 0) && (strcmp(list[i].firstName, student_firstname) != 0)){
            strcpy(list[i].firstName, student_firstname);
            strcpy(list[i].lastName, student_lastname);
            strcpy(list[i].grade, student_grade);
        }
        else{
            printf("This student is already on the list!");
        }
        //count++;
    }
    printf("Student added!");
}
看这句台词:

for (i = count-1; i < count; i++)
for(i=count-1;i

在“添加”和“显示”功能中。这从count-1到count,意味着它只在count-1位置打印/添加一个项目。您应该在add函数、increment count中去掉for循环,并重写print函数,使其从0变为count。这将解决您遇到的所有问题。

您在
add
中检查重复项的算法已损坏。我需要看起来更像这样,但您还应该添加错误检查和缓冲区溢出保护

void add(char* student_firstname, char* student_lastname, char* student_grade, char* student_level, struct student* list)
{
    for (int i = 0; i < count; i++){
        if ((strcmp(list[i].lastName, student_lastname) == 0) &&      
            (strcmp(list[i].firstName, student_firstname) == 0)) {
            printf("This student is already on the list!");
            return;
        }
    }
    strcpy(list[count].firstName, student_firstname);
    strcpy(list[count].lastName, student_lastname);
    strcpy(list[count].grade, student_grade);
    count++;
    printf("Student added!");
}
void add(char*student\u firstname、char*student\u lastname、char*student\u grade、char*student\u level、struct student*list)
{
for(int i=0;i
首先,您需要添加保护,以防止计数过大

其次,您需要停止使用strcpy,而是使用strncpy,以避免缓冲区溢出错误

第三,您可能希望避免使用线性扫描,并了解如何使用某种索引,但对于学校项目而言,这可能并不重要

与您的
显示
功能类似,如果您希望for循环打印所有记录,则应调整该循环;如果for循环只打印最后一条记录,则应消除该循环。

@MasterDNE--您的算法检查重复项失败,这就是您的问题。。。
for (i = count-1; i < count; i++)
void add(char* student_firstname, char* student_lastname, char* student_grade, char* student_level, struct student* list)
{
    for (int i = 0; i < count; i++){
        if ((strcmp(list[i].lastName, student_lastname) == 0) &&      
            (strcmp(list[i].firstName, student_firstname) == 0)) {
            printf("This student is already on the list!");
            return;
        }
    }
    strcpy(list[count].firstName, student_firstname);
    strcpy(list[count].lastName, student_lastname);
    strcpy(list[count].grade, student_grade);
    count++;
    printf("Student added!");
}