如何在C中调用单向链表中的字符串

问题描述

这是我的结构

struct Student
{
    int numberofstudents;
    float mid,prj,final,hmw;
    int lettergrade;
    int studentnumber;
    char name[40];
    char lastname[40];
    int birthyear;
    float totalgrade;
    struct Student *next;
    
}* head;

我有这样的功能

void searchbylastname(char *lastname)
{
    struct Student * temp = head;
    while(temp!=NULL)
    {   
        if(temp->lastname == lastname){
        
            printf("Student Number: %d\n",temp->studentnumber);
            printf("Name: %s\n",temp->name);
            printf("Surname: %s\n",temp->lastname);
            printf("Birth Year: %d\n",temp->birthyear);
            printf("Total Grade: %0.2f\n",temp->totalgrade); 
            return;     
        }
        temp = temp->next;
    }
    printf("Student with student number %s is not found !!!\n",lastname);
}

我用 switch case 在 main 中调用

    head = NULL;
    int choice;
    char name[50];
    char lastname[50];
    int birthyear;
    int studentnumber;
    float totalgrade;
    float prj,hmw,mid,final;

    case 6:
                printf("Enter student lastname to search: "); 
                scanf("%s",&lastname);
                searchbylastname(lastname);
                break; 

但它不能按姓氏搜索,它会自动引导我到这里;

printf("Student with student number %s is not found !!!\n",lastname);

我不知道该怎么办,如果有人有意见,我将不胜感激。

解决方法

== 不比较 C 中的字符串,只比较这些字符串的引用(地址)。如果它们不引用同一个对象,它们总是不同的。

要比较字符串,您需要使用 strcmp 函数。

https://www.man7.org/linux/man-pages/man3/strncmp.3.html

您的代码有更多问题。即使您使用 strcmp,它也会显示尚未找到学生的消息。如果您可能有更多的学生具有相同的姓氏(这更希望您需要添加一个标志)

void searchbylastname(char *lastname)
{
    struct Student * temp = head;
    int studentsFound = 0;
    while(temp!=NULL)
    {   
        if(!strcmp(temp->lastname,lastname)){
            stutentsFound = 1;
            printf("Student Number: %d\n",temp->studentnumber);
            printf("Name: %s\n",temp->name);
            printf("Surname: %s\n",temp->lastname);
            printf("Birth Year: %d\n",temp->birthyear);
            printf("Total Grade: %0.2f\n",temp->totalgrade);  
        }
        temp = temp->next;
    }
    if(!studentsFound) 
       printf("Students having %s surname have not been found !!!\n",lastname);
}