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

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

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

函数strspn在我尝试的所有情况下都工作得很好,除非使用mari,而我不知道为什么。
您可以在此example中测试它返回的长度为5insted of 4的值是否正确。

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

如果有人知道怎么解决这个问题的话。
发布于 2020-04-02 05:15:23
“五”是正确答案,"maria“中有五个连续的字符,它们也在"mari”中-- "m“、"a”、"r“、"i”和"a“。strspn函数提供第一个字符串中从开头开始的连续字符数,以及第二个字符串中的连续字符数。因为"a“在第二个字符串中,所以它总是算数的。
https://stackoverflow.com/questions/60980331
复制相似问题