指针和函数

时间:2018-04-28 13:36:35

标签: c pointers

我是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);
}

2 个答案:

答案 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;
}