字符串比较失效咨询:输入同名图书无法进入if判断分支
问题诊断与修复方案
嘿,这问题太典型了!你遇到的核心坑是C语言里不能用==直接比较字符串内容,哪怕你打印出来看着一模一样也不行。
为什么==不生效?
在C中,字符串本质是字符数组,bookz[r].name和a.name都是数组名,它们代表的是数组在内存中的起始地址。用==比较的是这两个地址是否相同,而不是字符串内容是否一致。哪怕两个字符串内容完全一样,只要它们存在不同的内存位置,==就会返回假,自然进不了if分支。
正确的字符串比较方式
你已经包含了<string.h>头文件,直接用strcmp()函数就好:
- 当
strcmp(str1, str2) == 0时,两个字符串内容完全相同 - 返回值小于0:str1小于str2(按ASCII码比较)
- 返回值大于0:str1大于str2
你的代码里还有其他需要修复的问题
- scanf格式错误:
scanf("%d, &copies_to_add");里的逗号是多余的,会导致输入无法正确读取,应该改成scanf("%d", &copies_to_add); - 数组索引错误:找到已存在的图书后,你修改的是
bookz[i].copies,但实际应该修改的是bookz[r].copies(r是找到的图书索引) - 循环逻辑问题:找到重复图书后,需要跳出外层的for循环,否则代码会继续执行添加新图书的逻辑
- 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
相关产品推荐
相关产品推荐

