You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串比较失效咨询:输入同名图书无法进入if判断分支

问题诊断与修复方案

嘿,这问题太典型了!你遇到的核心坑是C语言里不能用==直接比较字符串内容,哪怕你打印出来看着一模一样也不行。

为什么==不生效?

在C中,字符串本质是字符数组,bookz[r].name和a.name都是数组名,它们代表的是数组在内存中的起始地址。用==比较的是这两个地址是否相同,而不是字符串内容是否一致。哪怕两个字符串内容完全一样,只要它们存在不同的内存位置,==就会返回假,自然进不了if分支。

正确的字符串比较方式

你已经包含了<string.h>头文件,直接用strcmp()函数就好:

  • 当strcmp(str1, str2) == 0时,两个字符串内容完全相同
  • 返回值小于0:str1小于str2(按ASCII码比较)
  • 返回值大于0:str1大于str2

你的代码里还有其他需要修复的问题

  1. scanf格式错误:scanf("%d, &copies_to_add");里的逗号是多余的,会导致输入无法正确读取,应该改成scanf("%d", &copies_to_add);
  2. 数组索引错误:找到已存在的图书后,你修改的是bookz[i].copies,但实际应该修改的是bookz[r].copies(r是找到的图书索引)
  3. 循环逻辑问题:找到重复图书后,需要跳出外层的for循环,否则代码会继续执行添加新图书的逻辑
  4. scanf格式符冗余:scanf("\n%[^\n]s", &a.name);里的s是多余的,而且数组名不需要取地址,改成scanf("\n%[^\n]", a.name);即可

修复后的关键代码片段

// 替换原来的内层循环逻辑
for (r = 0; r < i+1; r++) {
    printf("%s %s\n", bookz[r].name, a.name);
    // 用strcmp比较字符串内容
    if (strcmp(bookz[r].name, a.name) == 0) {
        printf("The book already exists. Please enter the number of copies to add:");
        // 修复scanf格式错误
        scanf("%d", &copies_to_add);
        // 修复索引错误,用r而不是i
        bookz[r].copies += copies_to_add;
        printf("Additional copies (%d) of book %s were successfully added!", copies_to_add, a.name);
        // 设置标记,跳出外层循环
        opt = 0;
        break;
    }
}
// 在外层循环判断是否找到重复
if (opt == 0) {
    break;
}

额外提示

以后处理字符串比较、复制、拼接这类操作,记得优先用<string.h>里的标准函数,避免自己造轮子或者用错运算符。

内容的提问来源于stack exchange,提问作者din ohayon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:05