C编程新手和构建链表。
我需要一个函数来搜索链表中的元素,当我尝试运行代码并尝试搜索单词时,我知道它在那里它告诉我“单词未找到”
对我所拥有的任何帮助?
这是我的结构:
struct node
{
char data[100];
struct node *previous; // Points to the previous node
struct node *next; // Points out to the next node
}*head, *last;
这是我的搜索功能:
void search(struct node *head, char words[99])
{
while (head != NULL)
{
if (head->data[99] == words[99])
{
printf("word found\n");
return;
}
head = head->next;
}
printf("word not found\n");
}
这是我的主要内容:
printf("\nEnter key to search: ");
scanf("%s", &words[99]);
search(head, words);
任何帮助?
答案 0 :(得分:1)
首先,scanf将指针作为参数。而不是使用
scanf("%s", &words[99]); //which takes a pointer to the 100th char of the array
使用这行代码
scanf("%s", words); //which gives scanf a (char *), the place where the input should go. But this time it is the beginning of the array, not the 100th element
接下来
head->data[99] == words[99]
上面的行比较了每个字符串的第100个字符,而不是字符串。要做你想做的事,你需要将其替换为:
strcmp(head->data, words) == 0
将两个字符串作为参数,如果返回0,则表示两个字符串相等。
答案 1 :(得分:0)
一些事情......
首先,您需要在本地保存头指针的副本,以便不更改它。 在这样的简单列表中,可以自定义将最后一个元素的下一个指针设置为null,因此您的检查应该是:
struct node *current = head;
while (current->next != null) {
if ((strcmp(current->data, words) == 0) {
printf("Word found\n");
break;
}
current = current->next;
}
另请注意,传入的字符串应与struct(100)中的字符串大小相同。
答案 2 :(得分:0)
C中的标准字符串是一个字节序列,带有一个特殊字符(零,也称为\ x00或有时是NUL),用作字符串终止符。
当你写
之类的东西时char words[100];
然后你说你希望存在一个100字节的数组,并且你希望变量字是数组中第一个字节的内存地址。
您可以使用
将一些字节读入此数组scanf("%s", words);
只要输入的字符数不超过99个字符,就可以正常工作 - 空字节终结符需要额外的第100个字符。
比较字符串比您使用的其他语言(如Java)更低级。您可以通过编写
来比较字符串if( !strcmp(head->data, words) )
strcmp函数测试两个以null结尾的字节序列是否相等,如果它们是(奇怪的语义,但那就是C全部),则返回零。
您可能还想阅读scanf的手册页,了解限制写入数组的字符数的方法(如果用户输入超过99个字符会发生什么?)。
如果您的字符串可以包含空字节,那么C字符串对您来说是个问题:您需要使用不同的输入机制,为每个字符串存储长度和值,并使用memcmp进行比较。