在 C 中比较空字符串的结果



我在C程序中有两个char数组:

char stored_pass[15] = "steveone"
char pass[15] = "" 

当运行strcmp(stored_password, pass)比较两者时,我得到的结果是它们相等(==0(。

我真的不明白为什么会这样。

谁能向我解释一下?我查找了空字符串和以 null 结尾的字符串之间的区别,但没有真正找到答案。

问题似乎出在身份验证方法中。

整个C程序的源代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
// Execute any shell command
void execute(char *cmd)
{
execl("/bin/bash", "bash", "-p", "-c", cmd, NULL);
}
void sanitise(char *password)
{
int i,j;
char tmp[15];
// remove non-alphabet  characters from passwords
j=0;
for(i=0; i < 15; ++i) 
if(password[i] >= 'a' && password[i] <= 'z') {
tmp[j]=password[i];
++j;
} else break;
tmp[j] = '';
strcpy(password, tmp);
}
int authenticate(char *str)
{
char stored_password[15]="";
char pass[15];
char path[128] = "/etc/computer/Steve/password";
int i;
FILE *fpp; 
int auth=0;
fpp = fopen(path, "r");
if(fpp == NULL)
{
printf("Password file %s not foundn", path);
exit(1);
}
fgets(stored_password, 15, fpp);
sanitise(stored_password);
strcpy(pass, str);
sanitise(pass);
if(strcmp(stored_password,pass) == 0)
auth=1;
else {
auth=0;
}
fclose(fpp);
return auth; 
}
int main(int argc, char* argv[], char *envp[])
{
if(argc < 2) 
{
printf("Usage: %s passwordn", argv[0]);
return 0; 
}

if(!authenticate(argv[1])) {
// Log all failed attempts
printf("Wrong password. This incident has been logged.n");
execute("/home/Steve/Public/error.sh"); 
return 0;
}
execute("cat /etc/computer/Steve/secret");
return 0;
}

首先,您的 sanitise 函数放置一个"\0",从而在第一次找到非字母字符值时终止字符串。 你确定这是你想要的吗?(也许你想在 for 循环中使用 continue;而不是中断?( 如果文件中的密码和用户输入的密码都以数字开头,则两个比较的字符串都将等于"\0"。如前所述,尝试在 strcmp(( 调用之前打印两个字符串。

相关内容

  • 没有找到相关文章

最新更新