Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
C 已进行MD5哈希处理的字符串的MD5哈希:语法错误_C_Md5sum - Fatal编程技术网

C 已进行MD5哈希处理的字符串的MD5哈希:语法错误

C 已进行MD5哈希处理的字符串的MD5哈希:语法错误,c,md5sum,C,Md5sum,我想生成一个已经进行了md5哈希处理的字符串的md5哈希。这就是我所做的!我已经循环了它,但不幸的是,它显示了一些错误“sh:2:Syntax error:”|“unexpected”。 我希望这与循环中的“strcat”有关。 不知怎的,在回路内部 strcpy(command,"echo "); strcat(command,str); 都被忽略了。我在这里迷路了 有人能帮我吗 #include <stdio.h> #include <string.h> #incl

我想生成一个已经进行了md5哈希处理的字符串的md5哈希。这就是我所做的!我已经循环了它,但不幸的是,它显示了一些错误“sh:2:Syntax error:”|“unexpected”。 我希望这与循环中的“strcat”有关。 不知怎的,在回路内部

strcpy(command,"echo ");
strcat(command,str);
都被忽略了。我在这里迷路了

有人能帮我吗

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
   FILE *fp;
   char str[100], command[100];
   char var[100];
   int i;
   printf("Enter the string:\n");
   scanf("%[^\n]s",str);
   printf("\nString is: %s\n\n",str);
   for (i=0; i<3; i++) {
       strcpy(command,"echo ");
       strcat(command,str);
       strcat(command," | md5sum");
       strcat(command," | cut -c1-32");
       fp = popen(command, "r");
       fgets(var, sizeof(var), fp);
       pclose(fp);
       strcpy(str,var);
   }
   printf("The md5 has is :\n");
   printf("%s\n", var);   
   return 0;     

}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
文件*fp;
字符str[100],命令[100];
char-var[100];
int i;
printf(“输入字符串:\n”);
scanf(“%[^\n]s”,str);
printf(“\n字符串是:%s\n\n”,str);

对于(i=0;i您的问题来自
fgets
,它将linefeed保持在读取缓冲区上

来自man fgets:

fgets()从流中读取最多一个小于大小的字符,并将它们存储到s所指向的缓冲区中。读取在EOF或换行后停止。如果读取换行,则将其存储到缓冲区中。在缓冲区中最后一个字符后存储终止的空字节(
\0

因此,您可能需要将
\n
替换为一些
\0
。您可以使用
strcspn

   ...           
   fgets(var, sizeof(var), fp);
   pclose(fp);
   strcpy(str,var);

   /* remove first \n in str*/
   str[strcspn(str, "\n")] = '\0';

   ...

Io重定向是shell所做的事情,而不是通过
popen
执行的事情。如果您真的想从一个进程重定向到另一个进程,这是可能的,但远比复制/粘贴您在shell提示符下键入的内容(这看起来是您正在尝试的)复杂得多。我敢问,你为什么不使用像OpenSSL这样的加密库?使用该工具包对任何东西进行MD5哈希几乎都是微不足道的。感谢WhozCraig的输入。我将尝试此替代方法。它还应转义许多特殊字符,如重定向字符(
|
谢谢Mathieu和Ho Zong,我已经设法修复了我当前的代码。但是将使用库重写它。非常感谢