C 指针和函数
我是C编程新手。我从库中编写了这段代码 在这个函数中,第一个参数是输入,第二个参数是输出。现在的问题是如何得到主函数中第二个参数的值? 我已经写了这段代码,但是它出错了。这里怎么了C 指针和函数,c,pointers,C,Pointers,我是C编程新手。我从库中编写了这段代码 在这个函数中,第一个参数是输入,第二个参数是输出。现在的问题是如何得到主函数中第二个参数的值? 我已经写了这段代码,但是它出错了。这里怎么了 int main(){ char *id; satno2id(68, &id); printf("satellite number is %s", *id); } 在C语言中,数组的名称降级为指向该数组第一个元素的指针 函数中的id需要指向字符数组字符串的第一个元素的指针。这一点很明
int main(){
char *id;
satno2id(68, &id);
printf("satellite number is %s", *id);
}
在C语言中,数组的名称降级为指向该数组第一个元素的指针 函数中的id需要指向字符数组字符串的第一个元素的指针。这一点很明显,因为用于写入字符数组的sprintf函数在satno2id中使用 所以发送一个char数组,就像
char id[4];
satno2id(68, id);
我将数组的大小设置为4,因为satno2似乎正在写入长度为3的字符串。额外的字节用于存储\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;
}
您所说的错误是什么?char*id;只是一个指针,它没有空间来存储值。改为尝试charid[42];如果id可以是42个字符长。您的C编译器为您提供了一些有关此代码的诊断消息。你是不是忽略了他们?
#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;
}