我是C编程的新手。我已经从RTKLIB库中编写了此代码。
extern void satno2id(int sat, char *id)
{
int prn;
switch (satsys(sat, &prn)) {
case SYS_GPS: sprintf(id,"G%02d",prn-MINPRNGPS+1); return;
case SYS_GLO: sprintf(id,"R%02d",prn-MINPRNGLO+1); return;
case SYS_GAL: sprintf(id,"E%02d",prn-MINPRNGAL+1); return;
case SYS_BDS: sprintf(id,"C%02d",prn-MINPRNBDS+1); return;
}
strcpy(id, "");
}
在此函数中,第一个参数是Input,第二个参数是Output。现在的问题是我如何在main()
函数中得到第二个参数的值?
我已经编写了这段代码,但它收到了错误。这里有什么问题?
int main(){
char *id;
satno2id(68, &id);
printf("satellite number is %s", *id);
}
答案 0 :(得分:0)
在C中,数组的名称降级为指向该数组的第一个元素的指针。
函数中的id
需要指向字符数组(字符串)的第一个元素的指针。这很明显,因为在sprintf()
中使用了用于写入字符数组的satno2id()
函数。
所以发送一个char
数组,而不是
char id[4];
satno2id(68, id);
我将数组的大小设为4,因为satno2()
似乎正在写一个长度为3的字符串。额外的字节是存储\0
终结符。
答案 1 :(得分:0)
您需要将数组传递给satno2id
,而不是未初始化的指针。另外,为了避免缓冲区溢出,您还需要传递数组的长度,以便函数可以断言数组足够长。
#include <assert.h>
#define LEN(array) (sizeof (array) / sizeof (array)[0])
extern void satno2id(int sat, char id[], int idLen)
{
int prn;
assert(idLen >= 4 + 1);
switch (satsys(sat, &prn)) {
case SYS_GPS:
sprintf(id, "G%02d", prn - MINPRNGPS + 1);
break;
case SYS_GLO:
sprintf(id, "R%02d", prn - MINPRNGLO + 1);
break;
case SYS_GAL:
sprintf(id, "E%02d", prn - MINPRNGAL + 1);
break;
case SYS_BDS:
sprintf(id, "C%02d", prn - MINPRNBDS + 1);
break;
default:
strcpy(id, "");
}
}
int main(void)
{
char id[8];
satno2id(68, id, LEN(id));
printf("satellite number is %s\n", id);
return 0;
}