c文件输入功能无法正常工作

bf16

我有此功能,应该检查用户名是否被列入黑名单,如果不是,则应该通过检查该用户名是否存在于第二个文件中来“登录”用户。如果是,则将记住该文件中的该行,并且该函数应在第三个文件中检查是否记住的行上的密码正确,因此基本上,用户名所在的行是其密码所在的行,并且这两个行是否匹配输入,并且用户没有被列入黑名单,那么它应该返回一个肯定的答案。

不幸的是,无论我键入什么内容,我的函数似乎都返回肯定的答案。谁能指出我的错误是什么,它会按预期工作?

删除了意外错误,但仍然存在,如果文件不在blacklist.txt中,我将无法停止阅读

代码:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <signal.h>
#include <ctype.h>          
#include <arpa/inet.h>
#include <netdb.h>   

int login(char username[20],char pw[20])
{
    FILE *fp = fopen("blacklist.txt","r");          
    int ok = 0, pw_line=0,oku=0,savepwline=0,count=0,okp=0;

    while (ok==0)                                            
    {
        if (fp != NULL)
        {
            char line[20];
            while (fgets(line,sizeof(line), fp) != NULL)
            {                           
                size_t i=strlen(line)-1;
                if(line[i]=='\n')
                line[i]='\0';
                if (strcmp(username,line) == 0 ) ok=1;
            }
        }
    }
    fclose(fp);
    if (ok==1)
    {
        printf("user blacklisted\n");
    }
    else
    {
        FILE *fp2 = fopen("loginuser.txt","r"); 
        while (oku==0)                                            
        {
        if (fp2 != NULL)
        {
            char line3[20];
            while (fgets(line3,sizeof(line3), fp2) != NULL)
            {
                pw_line++;                            
                size_t i=strlen(line3)-1;
                if(line3[i]=='\n')
                line[i]='\0';
                if (strcmp(username,line3) == 0 ) { oku=1; savepwline=pw_line; }
            }
        }
        }
        FILE *fp3 = fopen("loginpw.txt","r"); 
        if (oku==1)
        if (fp3 != NULL)
        {
            char line2[20];
            while (fgets(line2,sizeof(line2), fp3) != NULL)
            {
                if ( count == savepwline )           
                {
                    size_t i=strlen(line2)-1;
                    if(line2[i]=='\n')
                        line2[i]='\0';
                    if (strcmp(pw,line2) == 0 ) okp=1;
                }
                else count++;
            }
        }
    fclose(fp2);
    fclose(fp3);
    }
    if(oku&&okp) return 1;
    else return 0;
}

int main()
{
 char a[20],b[20];
 scanf("%s",a);
 scanf("%s",b);
 if(login(a,b)) printf("yes");
else printf("no");
}

样本文件(“ loginuser.txt” /“ loginpw.txt”):

hihi
aloss
foif
distsd

blacklist.txt:

carl
gigc
ffgfd
gdfgdd
rreti
西玛·卡达万(Seema Kadavan)

我看不到代码有什么问题。

  • 如果用户名不在blacklist.txt中,则它永远不会退出while循环。而是读取到文件末尾。
  • 而不是“ ==”,而是给了“ =”进行比较,这将执行分配而不是比较。
  • 在打开文件后立即检查文件指针的有效性,这样就不必每次循环都对其进行验证。这是性能上的打击。
  • 编写文件读取功能。这将使调试更加容易。
  • 如果您不能使用调试器,请添加一些printf语句,这将有助于您理解代码流。

请参阅下面的更正代码。我尚未添加密码比较检查。你可以自己做。

// Returns 1 if found. Returns 0 on not found/error
int isEntryFound(char *fileName, char *inputStr)
{
    FILE *fp = fopen(fileName,"r");
    if (fp == NULL)
    {
        // Couldnt verify. Mark as error
        return 0;
    }
    int ok = 0;

    char line[20];
    while (fgets(line,sizeof(line), fp) != NULL)
    {
        size_t i=strlen(line)-1;
        if(line[i]=='\n')
            line[i]='\0';
        if (strcmp(inputStr,line) == 0 ) ok=1;
    }
    fclose(fp);
    if(ok == 1)
        return 1;
    return 0;

}

int login(char *username,char pw[20])
{
    int blackListed = isEntryFound("blacklist.txt", username);

    if(blackListed)
    {
        printf("Blacklisted\n");
        return 0;
    }

    int userFound = isEntryFound("loginuser.txt", username);

    if(!userFound)
    {
        printf("User not Found\n");
        return 0;
    }

    // TODO: Read and compare the passwords the same way
    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从C中的标准输入读取行的功能无法正常工作

来自分类Dev

C ++睡眠功能无法正常工作

来自分类Dev

无法使功能正常工作

来自分类Dev

在C中复制的文件无法正常工作

来自分类Dev

C ++打印到文件无法正常工作

来自分类Dev

在C中复制的文件无法正常工作

来自分类Dev

Bash功能来压缩文件无法正常工作

来自分类Dev

输入类型为“文件”时,$ dirty无法正常工作

来自分类Dev

输入类型为“文件”时,$ dirty无法正常工作

来自分类Dev

Lodash功能无法正常工作

来自分类Dev

该功能无法正常工作

来自分类Dev

拆分功能无法正常工作

来自分类Dev

替换功能无法正常工作

来自分类Dev

通话功能无法正常工作

来自分类Dev

repmat功能无法正常工作

来自分类Dev

循环功能无法正常工作

来自分类Dev

延迟功能无法正常工作

来自分类Dev

无法使阶乘功能正常工作

来自分类Dev

搜索功能无法正常工作

来自分类Dev

日期功能无法正常工作

来自分类Dev

平均功能无法正常工作

来自分类Dev

电源功能无法正常工作

来自分类Dev

SQL“ NOT IN”功能无法正常工作

来自分类Dev

删除功能无法正常工作

来自分类Dev

转换功能无法正常工作

来自分类Dev

无法使onClick功能正常工作

来自分类Dev

Jscript:功能无法正常工作

来自分类Dev

Lodash功能无法正常工作

来自分类Dev

Php 功能无法正常工作