我的函数中有一个字符串,如..
char *key="anyvalue";
现在我使用linux命令......
$openssl dgst -md5 -hmac "anyvalue" file.txt
现在问题是我需要通过C函数执行以下任务..
这是代码......
void func (char *key) {
char *key_new=key;
system("openssl -dgst md5 -hmac <got stuck here> file.txt");
}
我怎样才能将键值传递给labled部分?
我在php中做的很简单。 ...
$key="somevalue"
exec("openssl -dgst md5 -hmac $key file.txt");
C中有类似的东西吗?
如果没有那么请告诉我任何其他可能的方式???
限制:
密钥必须通过函数传递。
我不能把它当作C命令行参数。
编辑:
我试过这个......但首先我想提一下,它是一个大项目中的小文件,警告被视为错误..所以我也需要照顾它们
这是我做的 -
char *sstring=NULL;
sprintf(sstring, "openssl dgst -md5 -hmac \"%s\"
-out data3.md5 data3.txt",(char *)key);
system(sstring);
如果我不进行初始化,那么就会出现警告..
gcc -o hmacmd5.so -I.. -fPIC -fsigned-char -pipe -Wall
-Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Wnested-externs
-Winline -Werror -g -Wcast-align -DSENDIP_LIBS=\"/usr/local/lib/sendip\"
-shared hmacmd5.c ../libsendipaux.a ../libsendipaux.a
cc1: warnings being treated as errors
hmacmd5.c: In function ‘xoricv’:
hmacmd5.c:271:9: error: ‘sstring’ is used uninitialized in this function
make: *** [hmacmd5.so] Error 1
答案 0 :(得分:4)
我认为您正在寻找sprintf
:
int sprintf(char *STR, const char *FORMAT, ...);
在您的情况下,您将按如下方式使用它:
sprintf(some_allocated_output_string, "openssl -dgst md5 -hmac %s", key);
system(some_allocated_output_string);
修改强>
看到你试过的代码后,我看到我没有给你一个完整的答案。
这里有两个选择(假设下面的STRING_SIZE
是一些#defined
大小,如300或者其他东西):
1)使用预先分配的缓冲区:
char sstring[STRING_SIZE];
sprintf(sstring, "openssl -dgst md5 -hmac \"%s\" -out data3.md5 data3.txt",(char *)key);
system(sstring);
2)使用malloc / free:
#include <stdlib.h>
//blah blah blah
char *sstring=NULL;
//blah blah blah
sstring = malloc(STRING_SIZE);
sprintf(sstring, "openssl -dgst md5 -hmac \"%s\" -out data3.md5 data3.txt",(char *)key);
system(sstring);
free(sstring);
我会建议第一种方法。除此之外,如果您的编译器支持,我强烈建议使用@ pmg的snprintf
建议。这看起来像这样:
char sstring[STRING_SIZE];
int result = 0;
result = snprintf(sstring, STRING_SIZE, "openssl -dgst md5 -hmac \"%s\" -out data3.md5 data3.txt",(char *)key);
// Perform a check on result here, in case you ran out of space.
// If result > STRING_SIZE, you need to try a larger buffer.
system(sstring);
答案 1 :(得分:3)
您应该学习使用openssl API而不是调用命令行。
如果失败,你需要使用system
,而不是fork。
答案 2 :(得分:2)
如果你想写字符&#34;在C字符串中,您可以使用\&#34;
编写它所以,你写了
system("openssl dgst -md5 -hmac \"key\" file.txt");
如果您的密钥不是常量,则应使用snprintf
这样的事情:
char buffer[/*enough size*/];
snprintf(buffer, /*the size*/, "openssl dgst -md5 -hmac \"%s\" file.txt", key);
之后
system(buffer);
答案 3 :(得分:0)
怎么样:
void func (char *key) {
char *cmd = "openssl -dgst md5 -hmac ";
char *fullmsg = _malloc( strlen(key) + strlen(cmd) );
if (fullmsg != NULL) {
sprintf_s( fullmsg, sizeof(fullmsg), "%s%s", cmd, key );
system( fullmsg );
free( fullmsg );
} // else out of memory
}
答案 4 :(得分:0)
另一种选择:
void func(char * key)
{
char cmd[255] = "openssl dgst -md5 -hmac ";
assert(sizeof cmd > strlen(cmd) + strlen(key));
strcpy(cmd, key);
system(cmd);
}