鱼C论坛

 找回密码
 立即注册
查看: 695|回复: 3

[已解决](!strcmp(book->title, target)疑问

[复制链接]
发表于 2023-11-29 16:01:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. struct Book *searchBook(struct Book *library, char *target)
  2. {
  3.         struct Book *book;
  4.    
  5.         book = library;
  6.         while (book != NULL)
  7.         {
  8.                 if (!strcmp(book->title, target) || !strcmp(book->author, target))
  9.                 {
  10.                         break;
  11.                 }
  12.                 book = book->next;
  13.         }
  14.    
  15.         return book;
  16. }
复制代码

if (!strcmp(book->title, target) || !strcmp(book->author, target)) 这一句是什么意思? 一致的话strcmp返回值是1,!1=0, 0||0就book = book->next了?
最佳答案
2023-11-29 16:01:52
`!strcmp(book->title, target)` 这一句的意思是比较`book->title`和`target`两个字符串是否相同。`strcmp`函数在两个字符串相等时返回0,否则返回一个非零的值。因此,当`strcmp(book->title, target)`返回0时,`!strcmp(book->title, target)`就会返回1(真),表示两个字符串相同。

`||` 是逻辑或运算符,用于判断其左右两个表达式是否有一个为真。如果`!strcmp(book->title, target)`返回真(即两个字符串相同)或`!strcmp(book->author, target)`返回真(即两个字符串相同),那么整个条件表达式就为真,执行`break`语句跳出循环。

如果两个表达式都为假(即两个字符串都不相同),那么整个条件表达式为假,继续执行`book = book->next`,将`book`指针指向下一个书籍节点,继续遍历下一个书籍。

最终,如果没有找到与目标字符串匹配的书籍,循环结束后`book`将为NULL,函数返回NULL。

下面是一个简化的例子来说明这个过程:
  1. #include <stdio.h>
  2. #include <string.h>
  3. struct Book {
  4.     char title[100];
  5.     char author[100];
  6.     struct Book *next;
  7. };
  8. struct Book *searchBook(struct Book *library, char *target) {
  9.     struct Book *book = library;
  10.    
  11.     while (book != NULL) {
  12.         if (!strcmp(book->title, target) || !strcmp(book->author, target)) {
  13.             break;
  14.         }
  15.         book = book->next;
  16.     }
  17.    
  18.     return book;
  19. }
  20. int main() {
  21.     // 创建书籍链表
  22.     struct Book book1 = {"Book1", "Author1", NULL};
  23.     struct Book book2 = {"Book2", "Author2", NULL};
  24.     struct Book book3 = {"Book3", "Author3", NULL};
  25.     struct Book library = {NULL, NULL, &book1};
  26.     book1.next = &book2;
  27.     book2.next = &book3;
  28.     // 搜索书籍
  29.     struct Book *result = searchBook(&library, "Book2");
  30.    
  31.     // 输出结果
  32.     if (result != NULL) {
  33.         printf("找到匹配的书籍:%s\n", result->title);
  34.     } else {
  35.         printf("未找到匹配的书籍\n");
  36.     }
  37.     return 0;
  38. }
复制代码

在上面的例子中,我们创建了一个包含三本书的链表。然后通过调用`searchBook`函数来搜索标题为"Book2"的书籍。最终会输出"找到匹配的书籍:Book2"。如果将目标字符串改为"Book4",则输出"未找到匹配的书籍"。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-29 16:01:52 | 显示全部楼层    本楼为最佳答案   
`!strcmp(book->title, target)` 这一句的意思是比较`book->title`和`target`两个字符串是否相同。`strcmp`函数在两个字符串相等时返回0,否则返回一个非零的值。因此,当`strcmp(book->title, target)`返回0时,`!strcmp(book->title, target)`就会返回1(真),表示两个字符串相同。

`||` 是逻辑或运算符,用于判断其左右两个表达式是否有一个为真。如果`!strcmp(book->title, target)`返回真(即两个字符串相同)或`!strcmp(book->author, target)`返回真(即两个字符串相同),那么整个条件表达式就为真,执行`break`语句跳出循环。

如果两个表达式都为假(即两个字符串都不相同),那么整个条件表达式为假,继续执行`book = book->next`,将`book`指针指向下一个书籍节点,继续遍历下一个书籍。

最终,如果没有找到与目标字符串匹配的书籍,循环结束后`book`将为NULL,函数返回NULL。

下面是一个简化的例子来说明这个过程:
  1. #include <stdio.h>
  2. #include <string.h>
  3. struct Book {
  4.     char title[100];
  5.     char author[100];
  6.     struct Book *next;
  7. };
  8. struct Book *searchBook(struct Book *library, char *target) {
  9.     struct Book *book = library;
  10.    
  11.     while (book != NULL) {
  12.         if (!strcmp(book->title, target) || !strcmp(book->author, target)) {
  13.             break;
  14.         }
  15.         book = book->next;
  16.     }
  17.    
  18.     return book;
  19. }
  20. int main() {
  21.     // 创建书籍链表
  22.     struct Book book1 = {"Book1", "Author1", NULL};
  23.     struct Book book2 = {"Book2", "Author2", NULL};
  24.     struct Book book3 = {"Book3", "Author3", NULL};
  25.     struct Book library = {NULL, NULL, &book1};
  26.     book1.next = &book2;
  27.     book2.next = &book3;
  28.     // 搜索书籍
  29.     struct Book *result = searchBook(&library, "Book2");
  30.    
  31.     // 输出结果
  32.     if (result != NULL) {
  33.         printf("找到匹配的书籍:%s\n", result->title);
  34.     } else {
  35.         printf("未找到匹配的书籍\n");
  36.     }
  37.     return 0;
  38. }
复制代码

在上面的例子中,我们创建了一个包含三本书的链表。然后通过调用`searchBook`函数来搜索标题为"Book2"的书籍。最终会输出"找到匹配的书籍:Book2"。如果将目标字符串改为"Book4",则输出"未找到匹配的书籍"。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-29 16:02:28 | 显示全部楼层
哦,一致的话返回值是0 啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-29 16:02:39 | 显示全部楼层
妖娆乌龙茶 发表于 2023-11-29 16:02
哦,一致的话返回值是0 啊

是的,当两个字符串相等时,`strcmp`函数会返回0,表示相等。所以在条件判断中,`!strcmp(book->title, target)`这个表达式会返回1(真)。因为取反操作符`!`会将0转换为1,并且将非零值转换为0。所以在条件判断时,如果`strcmp`返回0,即两个字符串相等,`!strcmp(book->title, target)`就会返回1,表示条件成立。而如果`strcmp`返回非0的值,即两个字符串不相等,`!strcmp(book->title, target)`就会返回0,表示条件不成立。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-3 08:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表