2015-01-12 66 views
1

我有這個功能,應該檢查用戶名是否被列入黑名單,如果不是,它應該通過檢查用戶名是否存在於「登錄」用戶第二個文件。如果是,那麼該文件中的那一行將被記住,並且該函數應該在第三個文件中檢查,如果記住的行上的密碼是正確的,那麼基本上用戶名的行是他的密碼的行,並且如果這兩個匹配與輸入和用戶不列入黑名單,那麼它應該返回一個正解。c文件輸入功能沒有按預期工作

不幸的是,無論我輸入什麼,我的功能似乎都會返回一個肯定的答案。任何人都可以指出我的錯誤是什麼,以便它能按預期工作?

編輯了無意的錯誤,我仍然有和問題,即我不能停止閱讀,如果該文件是不是在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 
+2

'而(OK = 0){}'應該是'OK = 0;' – user3386109

+2

您是否嘗試過通過程序與調試器步進? –

+0

不,我現在不能使用調試器,不幸的是,或者那將是我嘗試的第一件事。 @ user3386109我不明白你的觀點 – bf16

回答

3

我可以看到代碼的幾個問題。

  • 如果用戶名不在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; 
} 
+0

我明白了,只是一個問題:爲什麼在登錄函數結束時返回0?不應該返回1嗎? – bf16

+0

您必須根據密碼比較的輸出來更改它 –