2010-08-25 84 views
1

这是我写的程序,任何人都可以告诉它有什么问题,因为无论我输入什么输入,它都会显示有效的用户。如何读取linux etc/passwd文件并比较用户输入名称以进行身份​​验证C

#include<stdio.h> 
#include<string.h> 
#define max_size 20 
void main() 
{ 
File *Fptr; 
char username[max_size]; 
char line[20]; 
if((fptr=fopen("/etc/passwd","r"))==NULL) 
{ 
    printf("cannot open file"); 
} 
else 
    { 
     fptr=fopen("/etc/passwd","r"); 
     fputs("enter the username",stdout); 
     fflush(stdout); 
     fgets(username,sizeof username,stdin); 
     while((fgets(line,sizeof(line),fptr))!=NULL) 
     { 
      if(strcmp(line,username)) 
      { 
      printf("%s valid user",username); 
      break; 
      } 
      else 
      { 
       printf("%s not valid user",username); 
      }  
     } 
    fclose(fptr); 
    } 
} 
+0

仅供参考,在将来,请选择您的代码并点击'101010'按钮进行正确格式化。 – 2010-08-25 15:53:52

+0

谢谢我将来照顾它 – suhel 2010-08-25 15:55:44

回答

1

strcmp将passwd文件中的整行与您输入的内容进行比较。 passwd文件包含的不仅仅是每行的用户名(查看passwd文件以查看我在说什么)。

+0

我看到文件passwd文件我应该比较字符串 – suhel 2010-08-25 16:04:23

3

strcmp是一个三路比较器。它告诉你字符串是否相等,或者如果第一个字符串按字典顺序小于或大于秒。

正因为如此,当用作booelan值时,其结果有点不直观。当字符串匹配时它将返回0,在if语句中计算结果为false。当字符串不同时,它返回非零值,通常为-1或1(所有值均为真)。

如果你想测试两个字符串是相同的,你应该改变

if(strcmp(line,username)) 

if(strcmp(line,username) == 0) 

还注意到斯塔基的答案大约线的/etc/passwd额外的内容。如果您仅进行上述更改,程序将始终返回“不是有效用户”。

+0

如果我把条件,如你所说,它显示我的“其他”部分,即无效我应该怎么做 – suhel 2010-08-25 16:03:15

+0

就像我说过的那样,这个改变是必要的,但不足以让你的程序工作。您必须将用户名与您从/ etc/passwd中读取的行上的其他信息分开。如果您想学习如何解析文本,请查看“strtok”,但如果您只是想完成某些工作,则应该使用POSIX API从/ etc/passwd中获取信息,这些信息是用于启动链接到。 – 2010-08-25 16:14:32

2

strcmp如果两个字符串完全等价,则返回0(这是false);如果字符串完全不同,则返回非零数字(这是真的)。

所以首先,你似乎有你的if-test错误的方式。其次,您只需要测试前导n字符,其中n是用户名的长度。关闭我的头顶,我建议你试试用替换您若测试:

if (!strncmp(line, username, strlen(username)) 
3

,而不是试图手动解析/etc/passwd,您可能需要使用getpwnam代替。

0

除了其他人已经指出您的strcmp测试条件错误这一事实之外,passwd文件中的行不仅包含用户名。您可以使用strstr来查看名称是否存在于特定行中。

if(strstr(line, username) == line) 
{ 
    /* valid user */ 
} 
相关问题