首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >string.h中的函数strspn无法正常工作

string.h中的函数strspn无法正常工作
EN

Stack Overflow用户
提问于 2020-04-02 05:06:45
回答 1查看 100关注 0票数 1

我有一个用C语言编写的程序,它将使用链表的学生列表存储为学院项目。

代码语言:javascript
复制
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[])

代码语言:javascript
复制
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);
}

该函数运行良好,我使用的是一个名为strspn的字符串.h函数。正如函数的定义所说,它返回在string1中找到的substring2的长度,所以一旦我获得长度,我就将其与作为参数在列表中进行搜索的子字符串的长度进行比较,如果它们相同,则意味着我找到了搜索结果之一。这工作得很好,但我只是遇到这个子字符串是"Mari“时,它不能正常工作。

这就是我获取数据的文件的样子。如果我使用子字符串"mari“进行搜索,我应该会在屏幕上显示我找到了两个结果,maria和mariano,因为两者都匹配。这就是我得到的:

尽管现在如果我们将参数从"mari“更改为"mar":

函数strspn在我尝试的所有情况下都工作得很好,除非使用mari,而我不知道为什么。

您可以在此example中测试它返回的长度为5insted of 4的值是否正确。

如果您尝试相同的代码,将"mari“更改为"mar”,它将返回3,这是匹配的正确长度:

如果有人知道怎么解决这个问题的话。

EN

回答 1

Stack Overflow用户

发布于 2020-04-02 05:15:23

“五”是正确答案,"maria“中有五个连续的字符,它们也在"mari”中-- "m“、"a”、"r“、"i”和"a“。strspn函数提供第一个字符串中从开头开始的连续字符数,以及第二个字符串中的连续字符数。因为"a“在第二个字符串中,所以它总是算数的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60980331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档