可以使以下更简单/更有效吗?

时间:2010-11-28 08:43:09

标签: c

我正在尝试将一些代码从动态类型语言转换为C.请 因为我没有C的实际经验,所以请耐心等待。

我有一个调度程序函数,决定如何根据它来转换它的输入 flag参数的值。

void output_dispatcher(char *str, int strlen, int flag) {
    char output[501];
    char *result;

    switch (flag) {
        /* No conversion */
        case 0:
            result = str;
            break;
        case 1:
            result = convert_type1(output, str, strlen);
            len = strlen(result);
            break;
        /* ... */
    }
    /* do something with result */
}

我目前有5种不同的输出转换器,它们都是(甚至未来 保证只生产300-500个字符。从我的阅读,它 最好使用堆变量而不是动态分配空间 堆叠,如果可能的话。一个函数声明如下:

static char * convert_type1(char *out, const char *in, int inlen);

我想避免调度员中的strlen,因为它是必要的 重新计算输出大小,因为输出转换器知道它们 构造输出。此外,因为我传入指向输出的指针 变量,我不应该返回结果指针,对吗?所以我修改 它到下面,但得到一个'不兼容的类型'编译错误。

void output_dispatcher(char *str, int strlen, int flag) {
    char output[501];

    switch (flag) {
        /* No conversion */
        case 0:
            output = str;  /* ERROR: incompatible type */
            break;
        case 1:
            strlen = convert_type1(output, str, strlen);
            break;
        /* ... */
    }
    /* do something with result */
}

这种方法可以运作,还是有更好的方法?

5 个答案:

答案 0 :(得分:1)

为了避免重新计算,输出转换器需要有这样的原型:

static char * convert_type1(char *out, const char *in, int *len);

这样称呼:

result = convert_type1(output, str, &strlen);

输出转换器内部需要读取现在包含字符串长度的指针的内容,并在返回之前覆盖该指针的内容。

关于堆与堆栈的问题,确实你需要使用堆,因为一旦函数结束,堆栈上分配的变量就会消失。

答案 1 :(得分:0)

该行:

output = str;

给你带来了问题,因为虽然数组和指针相似,但它们并不相同。

“output”是一个数组,而不是指针。

str = output;

会起作用,因为char ptr很像数组变量。

但事实恰恰相反,因为“输出”变量不只是指向数组的指针,而是数组本身。

例如,如果你有:

char output[501];
char output1[501];

你做了:

output1 = output;

这没关系,C会将输出数组的内容复制到output1数组中。

所以,你对阵列和ptrs只是有点困惑。

答案 2 :(得分:0)

char输出[501]; output = str; / *错误:不兼容的类型* /

=>

strncpy(output,str,sizeof(output));

注意,你应该检查'输出'是否足以容纳'str'

答案 3 :(得分:0)

这种情况下的错误是有道理的。 output是一个缓冲区,它将保存来自char数据,而str是指向内存中某些其他区域的指针。你不想指定str指向输出的地址,对吧?如果你想采用这种方法,我认为只需将str指向的数据复制到输出中。更好的是,如果不需要转换,只需使用str。

答案 4 :(得分:0)

C不允许通过直接赋值修改数组 - 您必须单独修改数组成员。因此,如果要将str指向的字符串复制到数组output中,则必须使用:

strcpy(output, str);

或者

memcpy(output, str, strlen + 1);

(在两种情况下,首先检查strlen < sizeof output)。

请注意,命名一个局部变量strlen,从而影响该名称的标准函数,对于稍后查看代码的人来说会更加困惑。我会选择另一个名字。