gpt4 book ai didi

c - 使用 popen() 时出现段错误

转载 作者:行者123 更新时间:2023-11-30 20:57:54 28 4
gpt4 key购买 nike

我有一个函数来加密一些字符串。这太棒了,但是......这是错误:(

我可以使用该功能一次,但第二次就崩溃了。

谢谢! :)

我使用 bash ubuntu (W10),编译项目时没有警告(和错误)。

char * encryptPassword(char * string){
printf("DEBUT\n");
FILE *fp=NULL;
char path[1035];
char password[32];
//char * password = NULL; //for the encrypt password
printf("MALLOC\n");
//password = (char *)malloc(33*sizeof(char));
char * result = NULL;
char chaine[128] = "echo ";
char end_chaine[128] = " | openssl md5 | cut -d ' ' -f2";
//Create the command
printf("STRCAT\n");
strcat(chaine,string);
strcat(chaine,end_chaine);
//Execute
printf("POPEN %s\n",chaine);
fp = popen(chaine, "r");
//Reclaim the encrypted password
printf("GETS\n");
fgets(path, sizeof(path)-1, fp);
pclose(fp);
//To remove the character '\n'
printf("SPRINTF\n");
sprintf(password,"%32s",path);
result = strtok(password,"\n");
printf("%s\n",result);
//OK IT'S FINISH !
return (result);
}

最佳答案

Segmentation Fault when I use popen()

您的问题可能在这里:

 strcat(chaine,string); 

如果输入参数字符串更多,则其他字段对于chaine来说太大,在这种情况下,您以未定义的行为写出它(这似乎是一个错误你的情况)

计算所需的长度,然后分配之前的字符串来填充它。

请注意,您可以通过两次调用 snprintf 以惰性方式完成此操作,第一次调用计算所需的大小,第二次调用填充命令。这是一种懒惰的方法,因为在这里你只是连接字符串,你不写需要非恒定大小的数字等。

<小时/>

但是也可以在popen之后:

sprintf(password,"%32s",path);

因为密码的大小为32,并且sprintf将写入33个字符来放置最后的空字符

<小时/>

如果你奇迹般地从函数中返回,你可能无法使用结果,因为它是 NULL 或指向堆栈的指针不再有效:密码 是一个局部变量,因此 strtok 返回 NULL 或 password 的地址成为函数的结果

关于c - 使用 popen() 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55478707/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com