如何使这个函数返回一个字符串

时间:2015-01-09 19:35:55

标签: c string

我有这段代码:

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);
}

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来电者功能中的返回值。