У меня есть программа на C, в которой список студентов, работающих со связанными списками, хранится как проект колледжа.
typedef struct
{
int day;
int month;
int year;
} date_t;
typedef struct
{
char name[50];
int dni;
char email[30];
float mark;
date_t birthDate;
bool gender;
} student_t;
typedef struct node
{
student_t student;
struct node *next;
} node_t;
int main() {
node_t *list;
InitList(&list);
ReadFromFile(&list);
//SearchByDni(list, 34790767);
//PrintList(list);
SearchByName(list, "mari");
printf("\nListSize: %u\n", ListSize(list));
printf("");
return 0;
}
Я заполняю список из файла студентами (эта часть работает нормально), но как только список заполнен, мне нужен метод для поиска в списке студентов по заданному имени (char [])
void SearchByName(node_t *list, char *name){
node_t *p;
int len;
int nameLength = strlen(name);
int studentsCount = 0;
for (p = list; p != NULL; p = p->next) {
len = strspn(p->student.name, name);
if (nameLength == len) {
studentsCount++;
printf("%s", p->student.name);
}
}
printf("Students found searching '%s': %d\n", name, studentsCount);
}
Функция работает нормально, я использую функцию string.h, которая называется strspn . Как сказано в определении функции, она возвращает длину подстроки2, найденной в строке1, поэтому, как только я получу длину, я сравниваю ее с длиной подстроки, заданной в качестве параметра для поиска в списке, если они являются То же самое означает, что я нашел один из результатов поиска. Это отлично работает, но я только что натолкнулся, когда эта подстрока "Mari", она не работает должным образом.
Вот как выглядит файл, в котором я получаю данные. Если я ищу с подстрокой "mari", я должен напечатать на экране, что я нашел 2 результата, maria и mariano, потому что оба совпадают. И вот что я получаю:
Хотя теперь, если мы изменим параметр с "mari" на "mar":
Функция strspn отлично работает во всех случаях, которые я пробовал, за исключением случаев, когда я использую mari, и я понятия не имею, почему.
Вы можете проверить в этом пример , что он возвращает длину 5 вместо 4 правильной.
И если вы попробуете тот же код, изменив "mari" «mar» возвращает 3, что соответствует правильной длине:
Если кто-нибудь знает, как решить эту проблему.