Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Linux中使用crypt()方法?_C_Linux_Unix_Crypt - Fatal编程技术网

如何在Linux中使用crypt()方法?

如何在Linux中使用crypt()方法?,c,linux,unix,crypt,C,Linux,Unix,Crypt,我只想使用crypt()生成一个加密密码,然后编写一个调用crypt()方法的演示。 这是我的密码 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { printf("%s\n",crypt("abc","ab")); exit(0); } #包括 #包括 #包括 int main() { printf(“%s\n”,crypt(“abc”,“ab”

我只想使用
crypt()
生成一个加密密码,然后编写一个调用
crypt()
方法的演示。 这是我的密码

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("%s\n",crypt("abc","ab"));
    exit(0);
}
#包括
#包括
#包括
int main()
{
printf(“%s\n”,crypt(“abc”,“ab”);
出口(0);
}
我使用gcc tem.c-lcrypt编译它,当我运行它时,一切似乎都正常,但是出现了一个“段错误”。所以请告诉我这个简单的程序有什么问题?

您需要这个:

#define _XOPEN_SOURCE
在源文件的顶部,在任何
#include
之前


或者使用gcc选项编译
-D_XOPEN_SOURCE

看起来它可能与加密库支持有关

尝试添加:

#include <crypt.h>

[mstanislav@pardalislabs ~]$ gcc tem.c -lcrypt
[mstanislav@pardalislabs ~]$ ./a.out  
abFZSxKKdq5s6
#包括
[mstanislav@pardalislabs~]$gcc tem.c-lcrypt
[mstanislav@pardalislabs~]$/a.out
abFZSxKKdq5s6

看起来不错!

如果使用标志
-Wall
编译,您将看到原因

如果您阅读,您将看到它在包含
之前使用了
#define(定义)XOPEN(源代码)。实际上,它应该在包含任何标题之前定义


如果不定义
\XOPEN\u SOURCE
,则
crypt
函数将不会是原型。然后编译器不知道实际返回类型是什么,也不知道参数的类型和数量。因此,它将假定函数返回
int
,而
printf
需要一个字符串,因此将存在类型mi导致崩溃的smatch。

根据
crypt.h
应包含在
crypt\u r()
中,仅
unistd.h
应包含在
crypt()中
在我的测试中,我收到了您对代码所做的分段错误。在添加了如上所述的include之后,它就起作用了。您是说修复程序没有修复您的测试,还是只是认为它不需要我的解决方案?A)我不是海报,只是一个临时观察者。B)我是说,依我看,我不喜欢在y不是必需的,并且(如
crypt()
文档中所述)只要有函数宏,就不需要该头文件。
#define
必须放在任何库头之前-这是glibc要求。不,这是POSIX要求。@R..glibc文档将其作为一项要求,但在这方面没有参考POSIX合规性。