Функция strspn из string.h не работает должным образом - PullRequest
1 голос
/ 02 апреля 2020

У меня есть программа на 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", она не работает должным образом.

students.txt Вот как выглядит файл, в котором я получаю данные. Если я ищу с подстрокой "mari", я должен напечатать на экране, что я нашел 2 результата, maria и mariano, потому что оба совпадают. И вот что я получаю:

enter image description here

Хотя теперь, если мы изменим параметр с "mari" на "mar":

enter image description here

Функция strspn отлично работает во всех случаях, которые я пробовал, за исключением случаев, когда я использую mari, и я понятия не имею, почему.

Вы можете проверить в этом пример , что он возвращает длину 5 вместо 4 правильной.

enter image description here

И если вы попробуете тот же код, изменив "mari" «mar» возвращает 3, что соответствует правильной длине:

enter image description here

Если кто-нибудь знает, как решить эту проблему.

1 Ответ

1 голос
/ 02 апреля 2020

Пять - правильный ответ. В «maria» есть пять последовательных символов, которые также находятся в «mari» - «m», «a», «r», «i» и «a». Функция strspn дает вам количество последовательных символов в первой строке, начиная с начала, которые также находятся во второй строке. Поскольку «а» находится во второй строке, оно всегда имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...