C文件I/O中的分段错误11

C文件I/O中的分段错误11,c,C,我正在编写一个函数,用于搜索如下格式的文本文件: #User1\pass\ #用户2\pass\ #用户3\pass\ 我已经编写了函数检查\u用户: int Check_User(char input[20], FILE *userlist) { int c, i; fseek(userlist, 0, SEEK_SET); while(1) { while((c = fgetc(userlist)) != '#') {

我正在编写一个函数,用于搜索如下格式的文本文件:

#User1\pass\
#用户2\pass\
#用户3\pass\

我已经编写了函数检查\u用户:

int Check_User(char input[20], FILE *userlist)
{
    int c, i;
    fseek(userlist, 0, SEEK_SET);
    while(1)
    {
        while((c = fgetc(userlist)) != '#')
        {
            if(c == EOF)
                return 1;
        }
        while(input[i] == (c = fgetc(userlist)))
        {
            i++;
        }
        i = 0;
        if(c == '\\')
            return 0;
    }
}
从这里叫做:

while(Check_User(username, userlist) == 0)
{
    printf("Username already in use. Please select another:");
    Get_Input(username);
}
Check user检查*userlist指向的文件,查看用户名[20]是否包含已在使用的用户名。如果它已经在使用中,它将调用Get_输入以获取新用户名

程序一直运行到while循环,然后给了我一个分段错误:11。我曾读到,这通常源于试图在数组末尾之外进行写操作,或者通常对无法访问的内存进行操作。Userlist.txt已在r+模式下打开


谢谢您的帮助。

您在第一次使用变量
i
之前没有初始化它。在C语言中,声明的变量不会初始化为数字0(就像在C#或Java中那样),而是简单地使用之前存在于其内存位置的值。因此,
i
的值可能远大于字符串
input
的长度,并且
input[i]
可能访问无效的内存位置


附带说明:要在Linux下自己快速调试,请使用调试符号(
gcc-g
)编译程序,然后使用
valgrind--tool=memcheck
,让valgrind为您找到错误源。

(1)您确定fopen成功吗?您确实需要检查以确保
userlist
不为空(2)我在使用之前从未初始化过。看起来是因为我没有初始化。呜呜,哈哈。我觉得错过了那件事有点傻。哦,好的,谢谢你。