我正在尝试将一些代码从动态类型语言转换为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 */
}
这种方法可以运作,还是有更好的方法?
答案 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
,从而影响该名称的标准函数,对于稍后查看代码的人来说会更加困惑。我会选择另一个名字。