【问题标题】:how to make this function return a string如何让这个函数返回一个字符串
【发布时间】:2015-03-08 04:57:37
【问题描述】:

我有这个代码:

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 生成指针 从没有强制转换的整数 [默认启用]

     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:警告:从不同的整数转换为指针 大小 [-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);
}

【问题讨论】:

  • 嗯,u8 显然不是正确的类型。
  • str 是一个未初始化的指针,具有未定义的值。使用时可能会崩溃。
  • @iharob * u8 -> 无符号整数类型,至少8位,相当于unsigned char
  • @PSantos VALUE 是什么ruby 使用的泛型类型?类似void *?我几乎可以肯定问题是您需要使用一些 ruby​​ 自定义内存分配功能,让解释器处理内存分配。你在哪里添加了free
  • @iharob 在 Ruby C API 中,每个 Ruby 类型/类都是一个 VALUE C 类型。实际上 VALUE 只是一个 uintptr_t C 类型,或者 void* 来简化事情。这就是 Ruby 的松散类型在 C 中实现的方式。

标签: c string


【解决方案1】:

我相信这就是你所需要的

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调用函数中的返回值。

【讨论】:

  • 这里的所有ints 真的应该是size_ts。
  • @alk 有时当我使用 size_t 时,OP 会问类似 What is size_t? 的问题。
  • 然后告诉他/她?但是,unsigned 至少是显而易见的。
  • @alk 哦,我已经告诉过他们,但他们会说哦,不,这太高级了,我只会使用int
  • signed 变量对于计算内存量或测量“字符串”的长度只是没有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多