C++单链表更新节点gol字段提示成功但值未生效问题
问题排查
核心bug出在赋值逻辑,共有4处逻辑错误:
- 最关键的笔误:
temp->gol==goldar;使用了**相等比较运算符==**而非赋值操作,这行代码仅会返回一个布尔值、不做任何写入操作,因为没有接收判断结果也不会触发编译报错,是提示更新成功但值未变化的直接原因。 - C风格char数组不支持直接用
=赋值:即使把==改成=,直接给char数组名赋值只会操作地址,不会把输入的字符串内容拷贝到节点的内存空间,需要用字符串拷贝函数完成赋值。 - 存在冗余无效代码:单独成行的
temp->id;没有任何执行效果,匹配到ID后写的temp->id=caridata;是重复赋值(本身就是靠ID相等才进入分支,ID值不需要重新写入)。 - 匹配到目标节点后没有终止遍历:更新完成后代码会继续遍历后续链表节点,如果存在重复ID会触发重复修改,做无意义的性能消耗。
修正后可运行代码
注意需要提前引入<cstring>头文件支持字符串拷贝操作:
#include <cstring> // 字符串拷贝函数依赖头文件 void edit() { node *temp = awal_ptr; char goldar[5]; int caridata; int ketemu = 0; if(awal_ptr != NULL) { cout << "\n Input Id Yang Akan Diedit\t: "; cin >> caridata; while(temp != NULL) { if(caridata == temp->id) { cout << ">>>------------------------------<<<" << endl; cout << " Nama\t: " << temp->nama << endl; cout << " Golongan Darah\t: " << temp->gol << endl; cout << " ------------------------------" << endl; ketemu = 1; cout << "Masukan Golongan Darah Baru: "; cin >> goldar; // 用安全字符串拷贝完成gol字段赋值,手动截断避免缓冲区溢出 strncpy(temp->gol, goldar, sizeof(temp->gol) - 1); temp->gol[sizeof(temp->gol) - 1] = '\0'; cout << "Data Berhasil Diupdate" << endl; break; // 更新完成直接跳出循环,终止无意义遍历 } temp = temp->next; } if(ketemu == 0) { cout << " Data tidak ditemukan"; } } else { cout << " Belum ada data!"; } getch(); }
补充说明
- 如果节点的
gol字段定义为std::string类型,不需要调用strcpy,直接写temp->gol = goldar;即可完成赋值,还能从根源避免char数组的缓冲区溢出风险。 - 这类
==和=笔误属于C/C++高频逻辑bug,编译器默认不会对无副作用的表达式抛出报错,可以在编译时开启高等级警告(比如gcc加-Wall参数),大部分编译器会对这类无意义的比较表达式抛出提示。
内容的提问来源于stack exchange,提问作者Xianying
相关产品推荐
相关产品推荐

