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
相关产品推荐
相关产品推荐

