【发布时间】:2019-12-04 23:42:50
【问题描述】:
所以,我有这个代码,其中密码是一个字符串,通过将标记分解为一个更大的字符串,并从文本文件中获得传递。我什至使用了 strcspn,所以我可以从 pass 中删除 '\n'。
if (ok == 1){
char buffer[20];
snprintf(buffer, sizeof(buffer), "%s.txt", username);
chdir("./passwords") ;
FILE *userf;
userf = fopen(buffer,"r");
if(userf == NULL){
perror("Eroare la fopen");
exit(1);
} else
printf("Am deschis fisierul cu parola\n");
char pass[20];
if(fgets(pass, sizeof(pass), userf) == NULL){
perror("Eroare la fgets");
exit(1);
}
pass [ strcspn(pass, "\r\n") ] = '\0';
printf("%s\n%s\n",password, pass);
printf("%i %i\n",strlen(password), strlen(pass));
if(strcmp(password, pass) == 0){
printf("Connected");
}
}
从终端可以看到,它打印出相同长度的相同字符串,但 strcmp 出于某种原因没有返回 0。我真的很困惑。
【问题讨论】:
-
你能提供一个minimal reproducible example吗?文件的相关内容是什么(如果它被正确读取,只需省略它并对内容进行硬编码)?我希望能够运行它并查看问题。此外,最好将输出显示为文本而不是屏幕截图。谢谢。
-
您确定从文件中读取的通行证末尾包含“\r”或“\n”吗?如果不是,并且传递长度为 20,您将在缓冲区边界上写入尾随 '\0'。