我正在try 用C语言创建一个具有唯一登录名的"bank"程序,为此,我有一个用户名文件,并判断用户输入的用户名是否与预先存在的用户名匹配,并在下面这样做

    FILE *pF = fopen("usernames.txt", "a+"); //opens 2nd file to read it, and creates it if it doesn't exist
    
    //int length = sizeof(userName) / sizeof(userName[0]);
    while (fgets(buffer, 255, pF)) { //reads file adn checks if the username is on it
        if (strncmp(buffer, userName, strlen(userName)) == 0) { //checks the amount of characters in the string userName and only compares those characters
            uniqueUsername = false;
            break;
        }
    }

然而,我的问题是,如果存在像"Daniel"这样的预先存在的用户名,您不能将"Dan"创建为另一个用户名.

我try 将strlen(userName)改为strlen(buffer),但这会比较缓冲区字符串的所有255个字符(我将其创建为255字节的虚拟数组),结果不匹配.有没有办法克服这个问题?

推荐答案

如果文件包含的用户名没有前导空格或尾随空格,每行一个,则只需验证除了与strncmp匹配之外,下一个字符是换行符'\n'.

以下是修改后的版本:

// check user name against the list of user names
// return -1  if the file cannot be open
// return 0   if the userName already exists
// return 1   if the userName was appended
int check_username(const char *userName) {
    char buffer[256];
    int uniqueUsername = 1;
    size_t len = strlen(userName);
    FILE *pF = fopen("usernames.txt", "a+");
    if (pF == NULL)
        return -1;
    while (fgets(buffer, sizeof buffer, pF)) {
        if (!strncmp(buffer, userName, len) && buffer[len] == '\n') {
            uniqueUsername = 0;
            break;
        }
    }
    if (uniqueUsername) {
        // append the unique user name
        fprintf(pF, "%s\n", userName);
    }
    fclose(pF);
    return uniqueUsername;
}

C++相关问答推荐

POSIX文件描述符位置

为什么复合文字(C99)的返回会生成更多的汇编代码?

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

将数据移动到寄存器时出现分段故障

我的C函数起作用了,但我不确定为什么

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

编译器如何处理具有更复杂值的枚举?

使用nmake for程序比Hello World稍微复杂一些

将回调/基于事件的C API转换为非回调API

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

Valgrind用net_pton()抱怨

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

CS50 pset 5的皱眉脸正确地处理了大多数基本单词,并且拼写判断不区分大小写.

某些EAX值的不同调用方的CPUID结果不一致

C编译和运行

程序对大输入给出错误答案

未为同一文件中的函数执行DirectFunctionCall

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

函数指针作为函数参数 - 应该使用 const 吗?

GDB 用内容初始化数组