我有这段代码:
static char * display(const u8 array[], int length) {
int i;
char *str;
for (i = 0; i < length; i++) {
if (i%32 == 0) {
//printf("\n");
strcat(str, "\n");
}
if (i%8 == 0) {
//printf(" ");
strcat(str, " ");
}
//printf("%02X", array[i]);
strcat(str, (char *)array[i]);
}
return str;
/*
char str[80];
strcpy (str,"these ");
strcat (str,"strings ");
strcat (str,"are ");
strcat (str,"concatenated.");
puts (str);
return 0;
*/
}
最初这段代码正在打印一个字符串。我不希望它打印一个字符串,我需要让它返回一个字符串。但它给了我这个错误:
main.c:在功能'显示'中:
main.c:1707:9:警告:传递'strcat'的参数2会产生指针 来自没有强制转换的整数[默认为ena bled]strcat(str, array[i]); ^ In file included from main.c:61:0:
/usr/include/string.h:133:14:注意:预期'const char * restrict '但参数的类型为'u8'extern char * strcat(char * __ restrict __dest,const char * __ restrict __src)
^ sh-4.2#gcc -o main * .c
main.c:在功能'显示'中:
main.c:1707:21:警告:从不同的整数转换为指针 size [-Wint-to-pointer-cast]
strcat(str,(char *)array [i]);
编辑:
构建共享对象并加载:
VALUE generateIt(char *valor) {
struct NESSIEstruct w;
u8 digest[DIGESTBYTES];
int i;
for(i=0; valor[i]!='\0'; ++i);
int sizeo = i;
NESSIEinit(&w);
NESSIEadd((u8*)valor, 8*sizeo, &w);
NESSIEfinalize(&w, digest);
return displayIt(digest, DIGESTBYTES);
}
顶部我做:
#include 'ruby.h'
我还添加了这个:
void
Init_whirlpool(){
rb_mWhirlpool = rb_define_module("Whirlpool");
rb_cClass = rb_define_class_under(rb_mWhirlpool, "Class", rb_cObject);
rb_define_method(rb_cClass, "generate", generateIt, 1);
}
答案 0 :(得分:2)
我相信这就是你需要的
static char *display(const unsigned char array[], int length)
{
int i, k;
char *str;
str = malloc(3 * length + 1);
if (str == NULL)
return NULL;
k = 0;
str[0] = '\0';
for (i = 0; i < length; i++) {
char hex[3];
if (i % 32 == 0)
str[k++] = '\n';
if (i % 8 == 0)
str[k++] = ' ';
snprintf(hex, sizeof(hex), "%02X", array[i]);
str[k++] = hex[0];
str[k++] = hex[1];
}
str[k] = '\0';
return str;
}
snprintf
是POSIX,如果它出现编译错误,请将其更改为_snprintf
。
并且不要忘记free
来电者功能中的返回值。