removeNameCard函数中字符串比较逻辑失效问题求助
解决C语言中字符串比较的问题:
== vs strcmp() 你遇到的是C语言字符串比较的经典坑——用==比较字符串时,实际对比的是内存地址而非内容。哪怕两个字符串看起来完全一样,只要它们存在不同的内存区域,==就会返回假,直接跳过你的if判断逻辑。
问题根源拆解
在你的代码里:
if (value == inputRecord[x].personName)
value是局部字符数组,inputRecord[x].personName是结构体中的字符数组,二者的内存地址完全不同,所以不管内容是否一致,==的结果永远是false。
正确解决方案:使用strcmp()函数
C标准库<string.h>提供的strcmp()函数,专门用来对比两个字符串的实际内容,它的返回规则是:
- 返回
0:两个字符串内容完全相同 - 返回负数:第一个字符串按ASCII顺序小于第二个
- 返回正数:第一个字符串按ASCII顺序大于第二个
另外还要处理fgets()的小坑:它会把你输入时按下的换行符\n也读进value数组,这会导致和结构体中没有换行符的personName对比失败,所以需要先把这个换行符剔除。
修改后的完整函数代码
void removeNameCard() { char value[20]; NameCard temp[MAX]; printf("Enter personName:\n"); while ((getchar()) != '\n'); // 清空输入缓冲区 fgets(value, 20, stdin); // 移除fgets读入的换行符,避免干扰对比 value[strcspn(value, "\n")] = '\0'; if (inputRecord[0].nameCardID != 0) { int found = 0; // 标记是否找到目标条目 for (int x = 0; x < MAX; x++) { // 用strcmp对比字符串内容,返回0表示完全一致 if (strcmp(value, inputRecord[x].personName) == 0) { // 移动数组元素,覆盖被删除的条目 for (int j = x; j < MAX - 1; j++) { // 修正循环上限,避免数组越界 inputRecord[j] = inputRecord[j + 1]; } inputRecord[MAX - 1].nameCardID = 0; I -= 1; // 注意变量名是大写I,和你定义的一致 printf("The name card is removed\n"); found = 1; break; } } // 循环结束后统一判断是否未找到,避免重复打印提示 if (!found) { printf("The target person name is not in the name card holder\n"); } } else { printf("The name card holder is empty\n"); } }
额外优化说明
- 修复了变量名错误:你定义的是
int I;,原代码里的i -=1;会编译报错,已修正为I -=1; - 添加了
found标记:避免每次循环不匹配都打印提示,只在整个遍历结束后统一反馈 - 修正了删除逻辑的循环上限:
j < MAX -1,防止访问inputRecord[MAX]造成数组越界
内容的提问来源于stack exchange,提问作者FDL9
相关产品推荐
相关产品推荐

