这是我写的程序,任何人都可以告诉它有什么问题,因为无论输入什么,它都会显示有效的用户。
#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 :(得分:6)
答案 1 :(得分:3)
strcmp
是一个三向比较器。它告诉您字符串是否相等,或者第一个字符串是否按字典顺序小于或大于秒。
因此,当用作booelan值时,其结果有点不直观。它在字符串匹配时返回0
,在if
语句中计算结果为false。当字符串不同时,它返回非零值,通常为-1或1(所有值都为true)。
如果要测试两个字符串是否相同,则应更改
if(strcmp(line,username))
到
if(strcmp(line,username) == 0)
另请注意Starkey关于/etc/passwd
中行的额外内容的回答。如果您只进行上述更改,您的程序将始终返回“非有效用户”。
答案 2 :(得分:3)
您可能想要使用getpwnam
而不是尝试手动解析/etc/passwd
。
答案 3 :(得分:2)
strcmp
返回0(这是假),如果字符串完全不同,则返回非零数字(这是真的)。
首先,您似乎错误地使用了if-test。其次,您需要仅测试前导n
个字符,其中n
是用户名的长度。在我的头脑中,我建议你尝试用以下代码替换你的if-test:
if (!strncmp(line, username, strlen(username))
答案 4 :(得分:1)
strcmp
将passwd文件中的整行与您输入的内容进行比较。 passwd文件不仅包含每行的用户名(查看passwd文件以查看我在说什么)。
答案 5 :(得分:0)
除了您的strcmp
测试条件错误之外,其他人已经指出,passwd文件中的行不仅仅包含用户名。您可以使用strstr
查看该名称是否存在于特定行中。
if(strstr(line, username) == line)
{
/* valid user */
}