【发布时间】:2020-07-13 18:14:56
【问题描述】:
我有一个 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 的 string.h 函数。正如函数的定义所说,它返回在 string1 中找到的子字符串 2 的长度,所以一旦我得到长度,我将它与作为参数给出的子字符串的长度进行比较,以在列表中进行搜索,如果它们是同样,这意味着我找到了搜索结果之一。这工作正常,但我只是遇到这个子字符串是“Mari”时它不能正常工作。
这就是我获取数据的文件的样子。如果我使用子字符串“mari”搜索,我应该在屏幕上打印我找到 2 个结果,maria 和 mariano,因为两者都匹配。这就是我得到的:
虽然现在如果我们将参数从“mari”更改为“mar”:
函数 strspn 在我尝试的所有情况下都可以正常工作,除非使用 mari,我不知道为什么。
您可以在此example 中测试它返回的长度为 5,其中 4 是正确的。
如果您尝试将“mari”更改为“mar”的相同代码,它会返回 3,这是匹配的正确长度:
如果有人知道如何解决这个问题。
【问题讨论】:
-
我们无法复制您的结果,因为我们的编译器不接受代码图片。
-
您有一个在线迷你演示的链接,请查看图片前的hiperlink
-
我想知道你为什么想到在这里使用
strspn。它不能区分“remi”和“meri”,也不能区分“bo”和“bobbobbo”。这可能就是为什么你的结论是strspn不能“正常”工作的原因——它可以,但你期待它不会做的事情。阅读您链接到的手册页。 -
@PolVilarrasa 但这是一个非现场链接,可能会在三年后也可能不会在其他人需要理解这个问题和答案时出现。
-
@DavidSchwartz 感谢您的声明,在以后的问题中我会应用它。