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

C语言银行程序中用户名唯一性验证的字符串比较问题求解

解决方案

问题根源在于前缀匹配而非精确匹配,加上fgets读取的内容包含换行符、a+模式打开后文件指针默认在末尾这两个隐藏问题。以下是修正方案:

核心修正步骤

  • 打开文件后将指针移到文件开头:a+模式默认指针在末尾,直接读取会获取不到已有内容。
  • 清理fgets读取的缓冲区:去掉末尾的换行符(fgets会把换行符\n一并读入)。
  • 改用精确字符串匹配:用strcmp替代strncmp,确保只有完全一致的用户名才会被判定重复。

修改后的完整代码

FILE *pF = fopen("usernames.txt", "a+");
if (pF == NULL) {
    perror("Failed to open username file");
    return; // 按需添加错误处理逻辑
}

// 将文件指针移到开头,才能读取已有用户名
fseek(pF, 0, SEEK_SET);

bool uniqueUsername = true;
char buffer[255];
while (fgets(buffer, sizeof(buffer), pF)) {
    // 移除缓冲区末尾的换行符(兼容文件最后一行无换行的情况)
    buffer[strcspn(buffer, "\n")] = '\0';
    
    // 精确比较两个用户名,完全相同时判定重复
    if (strcmp(buffer, userName) == 0) {
        uniqueUsername = false;
        break;
    }
}

fclose(pF); // 必须关闭文件,避免资源泄漏

关键细节说明

  • strcspn(buffer, "\n")会返回从缓冲区开头到第一个换行符的字符数,直接将该位置设为\0即可安全移除换行符,无需额外判断。
  • strcmp会逐字符比较直到遇到字符串结束符\0,只有两个字符串完全一致时才会返回0,彻底解决"Dan"和"Daniel"被误判重复的问题。
  • 必须检查fopen的返回值,避免空指针操作;文件使用完毕后务必调用fclose释放资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:22:36